Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Runtime.getRuntime.exec()挂起在不同情况下运行的同一命令_Java_Runtime.exec - Fatal编程技术网

Java Runtime.getRuntime.exec()挂起在不同情况下运行的同一命令

Java Runtime.getRuntime.exec()挂起在不同情况下运行的同一命令,java,runtime.exec,Java,Runtime.exec,当我使用Runtime.getRuntime.exec()从Java运行命令时,我遇到了一个有趣的问题。我的代码的以下部分基本上将doc文件转换为txt文件。catdoc是一种将输入文件转换为文本流并将其输出为标准输出的工具。输出被重定向到txt文件。对于某些文档文件,它工作得非常好,但是对于某些文档文件,它会挂起 String[] strArr1 = new String[]{"catdoc", docFilePath}; Process p1= Runtime.getRuntime().ex

当我使用Runtime.getRuntime.exec()从Java运行命令时,我遇到了一个有趣的问题。我的代码的以下部分基本上将doc文件转换为txt文件。catdoc是一种将输入文件转换为文本流并将其输出为标准输出的工具。输出被重定向到txt文件。对于某些文档文件,它工作得非常好,但是对于某些文档文件,它会挂起

String[] strArr1 = new String[]{"catdoc", docFilePath};
Process p1= Runtime.getRuntime().exec(strArr1);
p1.waitFor();

BufferedReader b = new BufferedReader(new InputStreamReader(p1.getInputStream()));
FileWriter writeoutStream = new java.io.FileWriter(file.txt);

while ((line = b.readLine()) != null) {
    writeoutStream.write(line);
    writeoutStream.write('\n');
}
writeoutStream.close();
b.close();
我有很多文档文件,这个代码段在一些文件上工作,但它挂在其中一个文件上,没有响应。我怀疑这可能是由于文件文件的大小造成的。可能吗?我想知道有没有办法解决这个问题


更新:我知道哪些文件导致运行时冻结。我尝试在这些文件上使用catdoc命令,它会产生正确的结果。因此,输入文件没有问题。

如果在使用所有输出之前调用
Process.waitFor()
,则进程可能会阻止尝试生成它。在读取代码后移动
waitFor()

在黑暗中拍摄,但是您是否尝试过在进程中使用
-b
标志运行
catdoc
命令

-b -处理损坏的MS Word文件。通常,catdoc检查文件的前8个字节是否为Microsoft OLE签名。如果是,它将处理文件, 否则它只会将其复制到stdin。其目的是将catdoc用作 用于查看扩展名为.doc的所有文件的筛选器


我在这里和其他地方尝试了所有建议的解决方案,但对Runtime.exec()没有帮助。这似乎是运行时命令中的内部缓冲区大小问题。我发现与runtime.exec()挂起的问题相同。我刚刚学习的java文档清楚地描述了这个问题

由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,如果未能及时写入子流程的输入流或读取子流程的输出流,可能会导致子流程阻塞,甚至死锁

因此,我决定使用ProcessBuilder而不是运行时。它彻底解决了我的问题。下面是我用于解决问题的代码:

String[] strArr1 = new String[]{"catdoc", docFilePath};
ProcessBuilder probuilder = new ProcessBuilder( strArr1 );
Process process = probuilder.start();

InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

FileWriter writeoutStream = new java.io.FileWriter(file.txt);

while ((line = br.readLine()) != null) {
    writeoutStream.write(line);
    writeoutStream.write('\n');
}
writeoutStream.close();
br.close();
isr.close();
is.close();

//Wait to get exit value
try {
    int exitVal = process.waitFor();
    System.out.println("\n\nExit Value is " + exitVal);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

这段代码适用于不同类型的命令(短或长)和不同大小的文件(大或小)。我的问题已完全解决。

首先找到它挂起的文档,然后尝试仅在此文档上运行命令以查找特定错误。。。无论如何,我猜它是在一个不存在的文档中运行命令的,我是这么做的。对于runtime.exec()挂起的文件,该命令在终端中运行并生成所需的结果。我将更新我的问题。'p1.getErrorStream()'检查此问题中是否有任何错误InputStream@fmodos未生成任何错误消息。基本上,程序挂起在
processp1=Runtime.getRuntime().exec(strArr1)行上可以发布未运行的命令的strArr1值吗?数组中的值是什么?我不认为它与catdoc有关。我在将pdf文件转换为txt文件时也遇到同样的问题。正如我在问题中提到的,我认为这与Runtime.getRuntime.exec()的内部错误有关。您还需要在单独的线程中或通过合并流来使用标准错误流。我认为您可能会感到困惑。
Runtime.exec()
ProcessBuilder
之间的区别在于
p1.waitFor()。这就是你的问题所在。如果将此添加到基于
ProcessBuilder
的实现中,则最终会出现相同的问题。