Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 复制大数据流时IOUtils.copy()挂起?_Java_Stream_Apache Commons Io - Fatal编程技术网

Java 复制大数据流时IOUtils.copy()挂起?

Java 复制大数据流时IOUtils.copy()挂起?,java,stream,apache-commons-io,Java,Stream,Apache Commons Io,我想用解析器解析某个文件的内容,解析器是一个外部windows程序。我是这样做的: String command = "src2srcml.exe --language java"; Process proc = Runtime.getRuntime().exec(command); InputStream fileInput = Files.newInputStream(file) OutputStream procOutput = proc.getOutputStream(); IOUt

我想用解析器解析某个文件的内容,解析器是一个外部windows程序。我是这样做的:

String command = "src2srcml.exe --language java";
Process proc = Runtime.getRuntime().exec(command);

InputStream fileInput = Files.newInputStream(file)
OutputStream procOutput = proc.getOutputStream();

IOUtils.copy(fileInput, procOutput);
copy()来自Commons IO 2.4库

当我的文件很小(几KB)时,一切正常。然而,当我试图复制一些相对较大的文件(~72KB)时,我的程序挂起

此外,当我在cmd中“手动”执行解析器时:

src2srcml.exe --language Java < BigFile.java
src2srcml.exe——Java语言
一切都很好


知道为什么会发生这种情况吗?

您应该缓冲输出流:

OutputStream procOutput = proc.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(procOutput);
IOUtils.copy(fileInput, bos);
此外,为什么不将fileInput重定向为流程InputStream呢

 ProcessBuilder pb = new ProcessBuilder(command);
 pb.redirectInput(file);
 Process proc = pb.start();
 proc.waitFor();

问题很可能是您没有在单独的线程中使用外部程序的输出。您需要启动一个单独的线程来使用输出,这样外部程序就不会被阻塞。

您确定问题在于大小而不是流本身吗?有一种方法IOUtils.copyragle(in,out),但它适用于大于2GB的流。所以72 KB应该不是问题。@luanjot您可能是对的。但是,问题出在哪里呢?字符编码?我帮不了你,因为我不知道src2srcml是如何工作的。输出是什么?文本?您能以任何方式将其打印到控制台吗?外部程序是否在标准输出上生成输出?@jtahlborn是的,它不会使用BufferedOutputStream进行扫描。我不能简单地重定向输入,因为事实上,我的输入流是一个ReplaceInputStream(我需要在解析之前替换几个字符)。@Kao-使用BufferedOutputStream只是部分解决方案。当您的输入变大时,它将再次失败。请参阅我的答案。@jtahlborn但Java程序正在通过管道连接到外部程序,因此这不需要Java程序中的另一个线程。(反过来说:绝对!)@laune我想使用ProcessBuilder,正如您在回答的第二部分中提到的。但是,有没有办法将输入重定向到流
pb.redirectInput()
只接受文件或ProcessBuilder.Redirect,它只能从文件创建。@Kao在这种情况下,请使用Process.getOutputStream(),包装到BuffredOutputStream中并写入。