ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

为什么命令行实用程序在通过java程序调用时会挂起?

2019-08-26 11:01:36  阅读:222  来源: 互联网

标签:runtime-exec barcode-scanner processbuilder java linux


我需要你在以下任务中提出建议和指导.
我使用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.

希望有所帮助

标签:runtime-exec,barcode-scanner,processbuilder,java,linux
来源: https://codeday.me/bug/20190826/1729248.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有