加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

运行外部“java myprog

发布时间:2020-12-14 19:19:18 所属栏目:Java 来源:网络整理
导读:我想编写一个运行外部“java myprog output.txt”命令的Java程序.最终目标是在两个不同的程序上运行此命令,并将它们的输出相似性与各自的输出文件进行比较. 我想我已经阅读了关于使用ProcessBuilder运行外部程序的所有相关文章,以及关于在该外部程序中处理用

我想编写一个运行外部“java myprog< input.txt> output.txt”命令的Java程序.最终目标是在两个不同的程序上运行此命令,并将它们的输出相似性与各自的输出文件进行比较.

我想我已经阅读了关于使用ProcessBuilder运行外部程序的所有相关文章,以及关于在该外部程序中处理用户输入的一些条目,但我仍然无法使其工作.根据我的阅读,我认为最好的方法是不运行上面的确切命令,而是读取input.txt文件并将其逐字节地提供给Process对象,然后收集输出并将其写入输出.txt …我对其他选项100%开放.

我根据读数将下面的代码放在一起.它似乎正确地将input.txt中的输入提供给myprog,但是当我尝试将外部程序的输出打印到控制台进行验证时,程序会在myprog中预期(惊讶)用户输入的位置挂起.

无论有没有redirectErrorStream(true)行,我都会遇到同样的问题.

我真的希望这是Java,因为我打算与我将比较的程序输出的人共享源代码,他们主要只熟悉Java.

import java.io.*;
import java.util.*;

public class test7 {

    public static void main(String args[]) {

        try {
            // WANT: "java myprog < input.txt > output.txt"
            String inputFile = "input.txt";
            String outputFile = "output.txt";

            ProcessBuilder pb = new ProcessBuilder("java","myprog");
            pb.redirectErrorStream(true); // merge stdout,stderr of process
            Process p = pb.start();

            // write input to the running program
            OutputStream pos = p.getOutputStream();
            InputStream fis = new FileInputStream(inputFile);
            int read = 0;
            while ( (read = fis.read()) != -1) {
                pos.write(read);
            }
            fis.close();

            // get output of running program
            InputStreamReader isr = new  InputStreamReader(p.getInputStream());
            BufferedReader br = new BufferedReader(isr);

            // HANGS HERE WHEN USER INPUT REQUIRED
            String lineRead;
            while ((lineRead = br.readLine()) != null) {
                System.out.println(lineRead);
            }

        }
        catch (IOException e) {
            e.printStackTrace(); 
        }
    } // end main

}

以下是myprog.java的内容:

import java.io.*;

public class myprog {

    public static void main(String args[]) throws IOException {

        System.out.println("Hello world!");
        System.out.println("Enter something:");

        BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));

        // the readLine() command causes ProcessBuilder to hang
        cin.readLine();
    }   
}

而input.txt文件就是

p

output.txt文件应该是

Hello world!
Enter something:
最佳答案
我想知道你的问题是否部分与不使用单独的线程读取输入和写入输出有关.例如:

   public static void main(String args[]) {

      try {
         // WANT: "java myprog < input.txt > output.txt"
         String inputFile = "input.txt";
         String outputFile = "output.txt";

         // my ProcessBuilder Strings will be different from yours
         ProcessBuilder pb = new ProcessBuilder("java","-cp",".;bin;","yr12.m04.a.MyProg");
         pb.redirectErrorStream(true); 
         Process p = pb.start();

         final OutputStream pos = p.getOutputStream();
         final PrintWriter pw = new PrintWriter(pos);
         final InputStream fis = new FileInputStream(inputFile);
         final BufferedReader fileBr = new BufferedReader(new InputStreamReader(fis));

         InputStreamReader isr = new InputStreamReader(p.getInputStream());
         final BufferedReader br = new BufferedReader(isr);

         new Thread(new Runnable() {
            public void run() {
               String lineRead;
               try {
                  while ((lineRead = br.readLine()) != null) {
                     System.out.println(lineRead);
                  }
               } catch (IOException e) {
                  e.printStackTrace();
               } finally {
                  if (br != null) {
                     try {
                        br.close();
                     } catch (IOException e) {
                        e.printStackTrace();
                     }
                  }
               }
            }
         }).start();

         new Thread(new Runnable() {
            public void run() {
               try {
                  String lineRead;
                  while ((lineRead = fileBr.readLine()) != null) {
                     pw.println(lineRead);
                  }
               } catch (IOException e) {
                  e.printStackTrace();
               } finally {
                  if (pw != null) {
                     pw.close();
                  }
                  if (fileBr != null) {
                     try {
                        fileBr.close();
                     } catch (IOException e) {
                        e.printStackTrace();
                     }
                  }
               }
            }
         }).start();

      } catch (IOException e) {
         e.printStackTrace();
      }
   } // end main

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读