Linux Command没有给出在java程序中调用的输出

时间:2012-05-08 11:59:13

标签: java linux runtime.exec

我试图使用java代码在linux上调用非linux命令。该命令所需的库安装在我的linux机器上。这是我的java代码,它使用Runtime.getRuntime()。exec();

来调用该命令。

该命令从图像文件中读取borcode并对其进行解码并在控制台上显示该值。

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class demo {
    public static void main(String args[]){
        getcodes();
    }
    public void getCodes(){
        try 
        { 
            Process p; 
            String command[]=new String[3];
            command[0]="dmtxread ";
            command[1]="-n ";
            command[2]="/home/administrator/sandip/xyz.tif";
            System.out.println("Command : "+command[0]+command[1]+command[2]);
            p=Runtime.getRuntime().exec(command);

            System.out.println(p.waitFor());
            BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line=reader.readLine();
            System.out.print("Decoded      :- "+line);
        }
        }catch(IOException e1) {
            e1.getMessage();
            e1.printStackTrace();
        }catch(InterruptedException e2) {
            e2.getMessage();
            e2.printStackTrace();
        } 
    }
}

当我在linux上运行这个java代码时,我得到了以下异常

例外的一部分如下:

命令:dmtxread -n /home/administrator/sandip/xyz.tif java.io.IOException:无法运行程序“dmtxread”:java.io.IOException:error = 2,没有这样的文件或目录     在java.lang.ProcessBuilder.start(ProcessBuilder.java:475)     在java.lang.Runtime.exec(Runtime.java:610)     在java.lang.Runtime.exec(Runtime.java:483)     在leadertechbarcode.TwoDBarCodeReadHelper.getCodes(TwoDBarCodeReadHelper.java:53)

有些时候程序会在调用以下代码行后挂起 p = Runtime.getRuntime.exec(命令)

当我复制代码打印的命令并在终端上运行时,它运行正常。

请告诉我这个问题的朋友。

有没有其他方法可以使用java调用此命令?

谢谢你!

1 个答案:

答案 0 :(得分:2)

您正在使用的Runtime.exec(String[])方法需要将第一个元素作为命令,将以下元素作为单个参数。因此,如果它们中有任何空格,它们将在传递给底层操作系统之前被转义或引用。

在您的情况下,command[0]包含命令的名称,后跟空格。这将导致系统搜索并执行其名称中包含该空间的命令。找不到这个。

要解决此问题,您应该删除command中每个元素内容周围的空格,或者您可以手动连接它们并将它们作为单个字符串传递给Runtime.exec(String)方法代替。请注意,您还有一个空格跟踪“-n”参数。你可能也需要删除那个。