当前位置: 首页 > 知识库问答 >
问题:

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

江正德
2023-03-14

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

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

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.tifjava.io.IOEx

有时程序在调用以下代码行后挂起 p=Runtime.getRuntime.exec(Command)

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

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

使用java调用这个命令还有其他方法吗?

谢谢你!

共有1个答案

钱志义
2023-03-14

您正在使用的< code > runtime . exec(String[])方法要求第一个元素是命令,后面的元素是单独的参数。因此,如果它们中有任何空格,它们将在被传递到底层操作系统之前被转义或引用。

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

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

 类似资料:
  • 问题内容: 我正在使用Groovy在我的Linux机器上执行命令并返回输出,但是我无法以某种方式使用管道(我认为),或者它可能没有在等待命令完成。 有什么问题或我的代码中缺少什么? 我的调用函数: 文件内容(更新:添加了exitVal println): 我的输出(更新:添加了exitVal值): 注意:我在内部使用。 问题答案: 您不能使用进行管道或重定向。这在Java中不起作用,因此在Groo

  • Linux的lsblk命令的输出是怎样看的? Q1:这是2个硬盘没有挂载吗还是1个呢,为什么他是树状显示的? Q2:type是不一样的,part的意思是这个盘被分成了2个分区吗? 主要是这个树状图没法搜索,所以问下大家

  • 问题内容: 我的问题是,我正在通过终端运行一些adb命令。我写了一个工具;这将使事情变得容易。回到问题所在,为了使命令运行,我必须在终端上输入“密码”。那么,我该如何做才能使“密码”部分出现在JOptionPane.showInputDialog框上? 这是我到目前为止的内容: 问题答案: 您可以“读取”过程输入,并在“检测到”密码提示时显示,并要求用户输入密码。 在开始该过程之前,您“可以”提示

  • 问题内容: 是否有Linux命令将列出此终端会话的所有可用命令和别名? 就像您键入“ a”并按下制表符一样,但是对于字母的每个字母。或运行“别名”,但也返回命令。 为什么?我想运行以下命令,看看命令是否可用: 问题答案: 您可以使用内置的bash(1) 将列出您可以运行的所有命令。 将列出您可以运行的所有别名。 将列出您可以运行的所有内置插件。 将列出您可以运行的所有关键字。 将列出您可以运行的所

  • 假设我使用以下代码段通过java调用命令行程序 在这种情况下,将为exec调用的程序分配多少内存?它是否与分配给jvm的内存有关?如果是,我如何克服这个限制? UPDATE 根据这个问题给出的答案,如何解决"java.io.IOException: error=12, Cannot分配内存"调用Runtime#exec()? 运行时。getRuntime()。exec使用与main相同的内存量分配

  • 问题内容: 但它们似乎更复杂。 我只是想将文件复制到Linux 命令调用的每个结果中。 这是怎么了?: 谢谢 问题答案: 这就是你想要的: 细分/解释: :调用find命令 :从当前工作目录开始搜索。 由于未指定深度标记,因此将递归搜索所有子文件夹 :查找具有明确名称的文件 :对于搜索结果,对它们执行其他命令 :复制以覆盖返回到的每个结果; 想一想每个搜索结果的去向。 :用于分隔要在其后运行的不同