2011-11-29 88 views
2

我想运行一个二进制文件,它是通过Java代码Genia Sequence Splitter。这个二进制文件是x型可执行文件,没有扩展名。我可以使用./geniass arg1 arg2 在终端运行该文件,其中arg1是输入文件arg2是输出文件 我想自动执行此过程。我尝试使用此代码在Ubuntu中使用Java运行二进制文件

public class geniaSSTag { 
    public static void geniaSS(String inputFile){ 
     System.out.println("Input file: "+inputFile); 

     String[]cmd={"bash","geniass/./geniass","in.txt","out.txt"}; 

     try { 
      String errOutput=""; 
Process process = Runtime.getRuntime().exec(cmd); 
String s = ""; 
BufferedReader br = new BufferedReader(new InputStreamReader(process 
         .getInputStream())); 
while ((s = br.readLine()) != null) 
{ 
    s += s + "\n"; 
}  
System.out.println(s); 

BufferedReader br2 = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
while (br2.ready() && (s = br2.readLine()) != null) 
{ 
    errOutput += s; 
} 
System.out.println(errOutput); 
     } catch (IOException ex) { 
      Logger.getLogger(geniaSSTag.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

但是当我尝试运行我得到这个错误

geniass /./ geniass:geniass /./ geniass:不能执行二进制文件

我该如何解决这个。任何帮助表示赞赏。

谢谢

+1

该文件是否可执行文件?你做了一个chmod + x文件名吗? –

+3

你是否尝试用绝对路径运行它?除了bash是不必要的。 – soulcheck

+2

尝试使用String [] cmd = {“绝对路径到geniass”,“in.txt”,“out.txt”}; – soulcheck

回答

0

我会首先从Java运行命令pwd看到你实际上是尝试。然后,您可以相应地更改可执行文件的路径。我想使用路径/home/xxx/yyy/geniass将始终工作。

另外还有一个不同版本的Runtime.exec(),它将工作目录作为参数。

0

尝试:

String[]cmd={"/full/path/to/geniass","in.txt","out.txt"}; 

相反

+0

另外,使用ProcessBuilder而不是'Runtime.exec' – OscarRyz

+0

谢谢大家。我尝试了一切,但它一直给我同样的错误。所以我写了一个脚本.sh并运行它来解决问题。我有一个预感,它可能是一个权限错误。但无论如何,事情现在好了。 – manjulapra

1

当你运行该程序时,相对于程序的方式启动目录的可执行文件,它位于“./genias/genias”是什么?请注意,“/./”除了浪费空间之外不会做任何事情,因为它是“链接回当前目录的子目录”的缩写。

也许您的“genias”可执行文件不在名为“genias”的子目录中,或启动程序正在从其他目录启动,并且无法找到与其目录相关的“genias/genias”。

正如其他地方所建议的,您可以通过在启动命令中使用绝对路径来解决此问题。但是,如果您需要安装多个副本,有时这种方法的灵活性不够。