你这个思路是错误的,不可能实现。首先getInputStream()只能获得Perl解释器的输入流,Perl打印应该输出到输出流,所以只能使用getOutputStream(),但输出流没有办法读。此路不通。
换一个思路,命令行下,通常都提供管道功能(通过|连接),所以可以使用命令行所提供的管道,Java程序中,只需要从System.in中读取流就行了。下面是一个简单的测试例子:
// ProcessInput
// import Java packages
import java.io.*;
public class ProcessInput {
    public static void main( String[] args ) throws Exception {
        Reader in = new InputStreamReader( System.in );
        BufferedReader bin = new BufferedReader( in );
        String s = bin.readLine();
        int counter = 0;
        while( s != null ) {
            System.out.println( ++counter + ": " + s );
            s = bin.readLine();
        }
    }
}
命令行下命令为
HelloWorld.exe | java ProcessInput
HelloWorld.exe打印出十个"Hello, World!",输出为
1: Hello, World!
2: Hello, World!
3: Hello, World!
4: Hello, World!
5: Hello, World!
6: Hello, World!
7: Hello, World!
8: Hello, World!
9: Hello, World!
10: Hello, World!

解决方案 »

  1.   

    谢谢你的热心解答,不过我忘了说清楚我的意思了。
    其实我是想由那个Java文件来调用运行那个Perl文件,通过这个Java文件将Perl的输出再打印到屏幕上。但是类似于HelloWorld.exe | java ProcessInput这样的好像还是要手动运行那个Perl文件。
      

  2.   

    好像是我弄错了,这个是可以的,getInputStream()是将子进程的outputStream通过管道输出。
    你这里错误的原因是你的Perl程序应该通过shell启动,而不是自己启动,可以定义一个字串如下:
    String[] cmd = { "sh", "-c", dir + " " + task }; 
      

  3.   

    因为perl文件本身不是应用程序,所以要通过shell(sh)来解释
    linux下可以查看sh的manpage,输入man sh即可
    -c 指示sh读取后面的命令
    dir + " " + task 就是你要执行的命令了
      

  4.   

    今天我发现其实是我这里在处理要返回的字符串上有一些问题,直接用exec(dir+" "+task)或者exec("perl "+dir+" "+task)都是可以的。但是我试着用exec("sh -c "+dir+" "+task)似乎task所表示的参数并没有起作用。
    而在Console下直接运行sh -c ./free_align.pl aattagcaatagcat ccagttatc(free_align.pl对应于dir,aattagcaatagcat ccagttatc对应于task)也是参数没有起作用。但在Console下直接./free_align.pl aattagcaatagcat ccagttatc或者perl ./free_align.pl aattagcaatagcat ccagttatc都是可以的。