【发布时间】:2020-08-09 23:32:56
【问题描述】:
我需要在 windows 上运行 java 的 unix 程序。 unix 程序将文件名作为第一个参数,处理文件,并将处理后的文件返回到标准输出。
以下内容可在 CMD 控制台中完美运行:
wsl.exe /home/user/process /mnt/c/Users/user/input
它将 stdout 和 stderr 打印到控制台;或者我可以将标准输出重定向到一个重 1.2MB 的新文件中。
我想用 Java 做同样的事情。以下代码是最简化的版本
ProcessBuilder toCsv = new ProcessBuilder("wsl.exe", "/home/user/process", "/mnt/c/Users/user/input");
Process proc = toCsv.start();
try (InputStream is = proc.getInputStream()){
for(int i=0; is.read() != -1; i++) {
System.out.println(i);
}
}
这总是在字节数 380927 上停止。调试器显示它在 FileInputStream.read 上停止
- 我尝试使用重定向将标准输出发送到文件
- 我尝试只读取标准错误
- 我尝试使用
waitFor在主线程上阅读不同的线程 - 我尝试在没有
mainFor的主线程上阅读不同的线程 - 我尝试在不使用
Thread.sleep而不是 waitFor 的情况下阅读 - 我尝试将
"/bin/bash", "-c", exec+" "+execFile传递给 ProcessBuilder - 我尝试使用 Runtime.exec 而不是 ProcessBuilder
- 我试过
"/bin/bash", "-c", "while :; do echo 1; done"。这实际上打破了 380k 字节的限制,并且像预期的那样无限增长。
发生了什么,我该如何解决?
附: unix 可执行文件的源代码是here,但我认为它不是很有用,因为它可以通过 CMD 运行
【问题讨论】:
标签: java process windows-subsystem-for-linux processbuilder