为什么命令行实用程序在通过java程序调用时会挂起?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么命令行实用程序在通过java程序调用时会挂起?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3048字,纯文字阅读大概需要5分钟。
内容图文
我需要你在以下任务中提出建议和指导.
我使用libdmtx,它附带一个命令行实用程序,它读取ECC200 Data Matrix条形码的图像文件,读取它们的内容,并将解码的消息写入标准输出.
我想在linux平台上的java程序中使用这个命令行实用程序.我使用的是ubuntu linux.我在我的linux机器上安装了libdmtx.当我调用命令时
dmtxread -n /home/admin/ab.tif
在linux终端上,它立即在图像中提供条形码的解码值.
当我要使用我的java程序调用此命令时,代码会执行命令,而dotn会提供输出.
看起来程序正在处理或挂起.
以下是我的java代码,它调用以下命令
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class Classtest {
public static void getCodes(){
try
{
Process p;
String command[]=new String[3];
command[0]="dmtxread";
command[1]="-n";
command[2]="/home/admin/ab.tif";
System.out.println("Command : "+command[0]+command[1]+command[2]);
p=Runtime.getRuntime().exec(command); //I think hangs over here.
BufferedReader reader=new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line=reader.readLine();
if(line==null){
reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
line=reader.readLine();
System.out.print("Decoded :- "+line);
}else{
System.out.print("Error :- "+line);
}
System.out.println(p.waitFor());
}catch(IOException e1) {
e1.getMessage();
e1.printStackTrace();
}catch(InterruptedException e2) {
e2.getMessage();
e2.printStackTrace();
}
}
public static void main(String args[]){
getCodes();
}
}
请告诉我朋友我的代码出错了.
我参考了以下文章,但是得到任何帮助
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
请指导我的朋友们!
谢谢!
这是我使用ProcessBuilder类的新代码,此代码也提供与上面代码相??同的输出,它挂在行
Process process = pb.start();
public class Test {
public static void main(final String[] args) throws IOException, InterruptedException {
//Build command
List<String> commands = new ArrayList<String>();
commands.add("dmtxread");
commands.add("-n");
commands.add("/home/admin/ab.tif");
System.out.println(commands);
//Run macro on target
ProcessBuilder pb = new ProcessBuilder(commands);
pb.redirectErrorStream(true);
Process process = pb.start();
//Read output
StringBuilder out = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null, previous = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
//Check result
if (process.waitFor() == 0)
System.out.println("Success!");
System.exit(0);
//Abnormal termination: Log command parameters and output and throw ExecutionException
System.err.println(commands);
System.err.println(out.toString());
System.exit(1);
}
}
请指导我解决这个问题.
谢谢!
解决方法:
readLine阻塞,直到它从错误流中接收到新行.因此,如果没有输出,您的程序将不会超过第一个readLine.
为简单起见,我建议您使用ProcessBuilder而不是Runtime.exec(),它允许您合并两个InputStream,如下所示:
ProcessBuilder builder = new ProcessBuilder(cmd,arg0,arg1);
builder.redirectErrorStream(true);
Process process = builder.start();
那么,现在你可以从中读取一个.
或者,您可以使用单独的线程来使用两个InputStream.
希望有所帮助
内容总结
以上是互联网集市为您收集整理的为什么命令行实用程序在通过java程序调用时会挂起?全部内容,希望文章能够帮你解决为什么命令行实用程序在通过java程序调用时会挂起?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。