如何从Java';谁是BufferedReader?
我在树莓皮上运行这个java程序。程序应该运行脚本“hello_pixy”并扫描它打印出来的内容。当我手动运行hello_pixy时,它会正常打印出行(通过C的printf行)。但是当我运行程序时,没有输出任何内容,BufferedReader也没有读取任何行 如果我将脚本替换为类似“ls”的内容,那么BufferedReader将读取并打印出来。有没有一种方法可以将C中的“printf”更改为发送到InputStream(我对C不太了解,从Java的经验来看已经足够了)如何从Java';谁是BufferedReader?,java,linux,bufferedreader,Java,Linux,Bufferedreader,我在树莓皮上运行这个java程序。程序应该运行脚本“hello_pixy”并扫描它打印出来的内容。当我手动运行hello_pixy时,它会正常打印出行(通过C的printf行)。但是当我运行程序时,没有输出任何内容,BufferedReader也没有读取任何行 如果我将脚本替换为类似“ls”的内容,那么BufferedReader将读取并打印出来。有没有一种方法可以将C中的“printf”更改为发送到InputStream(我对C不太了解,从Java的经验来看已经足够了) 我正在执行的代码如下:
我正在执行的代码如下:您正在从头到脚地执行此操作。您必须先读取所有进程的输出,然后调用
waitFor()
。您的方式可能只是死锁,因为进程在生成所有输出之前无法退出,如果您不读取它,它最终将阻塞
注:
try
块中代码成功与否的代码必须位于该try
块内。目前,您正在继续处理异常,就好像它们没有发生一样。不要这样写代码与C无关,特别是考虑到它不是一个“脚本”,而是一个已编译的二进制文件。为什么要尝试从输入流中读取?可能您需要输出stream@IlyaBursov进程的
InputStream
是它的标准输出。注意:运行sudo
可能意味着进程正在等待进程。在等待进程完成后,您无法读取进程的标准输出。您需要首先读取,然后waitFor
@ManjinderSinghHanjra在本例中,我们正在与一个进程通信,我们希望读取(输入流)该进程写入(到stdout)的内容。从进程中运行的程序的角度来看,它正在写入标准输出。从Java程序的角度来看,我们是从输入流中读取的。感谢您的回答和提示。起初它不起作用,但我意识到我的路径也不正确。一旦我做了两个修复,它就成功了,谢谢。
Process process = null;
try {
process = Runtime.getRuntime().exec("sudo .ss/pixy/build/hello_pixy/hello_pixy");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //for Windows
try {
process.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
String print = "";
try {
while ((line = reader.readLine()) != null) {
print += line;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("\nCodescan:\n\n" + print);