首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >运行外部"java myprog < input.txt > output.txt“的Java程序

运行外部"java myprog < input.txt > output.txt“的Java程序
EN

Stack Overflow用户
提问于 2012-04-18 14:42:23
回答 3查看 2K关注 0票数 5

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

我想我已经阅读了几乎所有关于使用ProcessBuilder运行外部程序的相关文章,以及关于在该外部程序中处理用户输入的几篇文章,但我仍然不能让事情正常工作。根据我所读到的,我认为最好的方法是不运行上面的命令,而是读取input.txt文件并将其逐个字节地提供给Process对象,然后收集输出并将其写入output.txt ...我对其他选择持100%的开放态度。

我根据我的阅读将下面的代码组合在一起。它似乎正确地将来自input.txt的输入输入到myprog中,但当我尝试将外部程序的输出打印到控制台以进行验证时,程序在myprog中期望(意外)用户输入的地方挂起。

我在使用和不使用redirectErrorStream(true)行时都遇到了同样的问题。

我真的希望这是在Java中,因为我计划与我将比较其程序输出的人分享源代码,而他们主要只熟悉Java。

代码语言:javascript
运行
AI代码解释
复制
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的内容:

代码语言:javascript
运行
AI代码解释
复制
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文件只是

代码语言:javascript
运行
AI代码解释
复制
p

output.txt文件应为

代码语言:javascript
运行
AI代码解释
复制
Hello world!
Enter something:
EN

回答 3

Stack Overflow用户

发布于 2012-04-18 16:39:40

我想知道你的问题是否部分是因为没有使用单独的线程来读取输入和写入输出。例如:

代码语言:javascript
运行
AI代码解释
复制
   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
票数 4
EN

Stack Overflow用户

发布于 2012-04-18 14:50:19

你有没有想过改用Runtime.getRuntime().exec()?

代码语言:javascript
运行
AI代码解释
复制
Process proc = Runtime.getRuntime().exec("java myprog "+inputFile+" "+outputFile);
票数 0
EN

Stack Overflow用户

发布于 2012-04-18 16:07:07

您可以包含'myprog‘的jar文件并自己调用main()方法。更重要的是,如果myprog在您的域中,您可以完全摆脱main方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10211821

复制
相关文章
java如何运行_如何运行java程序[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 我们在编写Java程序以后都会在集成开发环境中运行程序,那么该如何的在命令行中运行Java程序呢?下面动力节点java学院小编为大家介绍如何运行java程序?
全栈程序员站长
2022/09/08
5.1K0
java如何运行_如何运行java程序[通俗易懂]
Java魔法堂:调用外部程序
Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程。那能不能通过简单一些、学习成本低一些的方式呢?答案是肯定的,在功能实现放在首位的情况下,借他山之石是最简洁有力的做法。
^_^肥仔John
2021/02/25
1.7K0
Java魔法堂:调用外部程序
java调用外部应用程序
最近因为需要做视频文件转换,在网上找了下,比较多的推荐是使用ffmpeg来实现,于是准备在java语言的基础上去实现,经过分析其实就是调用ffmpeg提供的应用命令去完成。
sucl
2019/08/07
3.6K1
java调用外部应用程序
Java学习笔记 调用外部程序
本文介绍了如何通过Java调用外部程序,并给出了具体的代码示例。主要包括了使用ProcessBuilder类创建子进程、重定向输出流、获取输出结果以及处理输出结果等步骤。同时,还讨论了如何在命令行中传递参数以及处理输出结果等细节,对于常见的外部程序调用场景具有较广泛的应用价值。
乐百川
2018/01/08
1.9K0
java输入输出流实例代码
1.编写一个程序,读取源代码文件的内容并在控制台输出。如果源文件不存在,则显示相应的错误信息。
全栈程序员站长
2022/09/01
6180
java程序编译命令_使用 java 命令编译运行 java 程序
java 编译的过程,就是将 java 项目从源文件变成 .class 文件的过程,而 .class 文件,最后会被加载到JVM 中运行。在 JDK bin/ 目录下,提供了 javac 命令,用于将 .java 源文件编译成 .class 字节码文件,提供了 java 命令,以 Main_Class 为入口,根据运行需要,加载相应的 class 文件到 JVM 中执行。
全栈程序员站长
2022/09/08
3.2K0
java和javac编译运行java程序
但是在学习过程中,我想在命令行测试一些JVM参数的时候,发现自己脱离了IDE,竟然无法直接编译java程序!!
全栈程序员站长
2022/09/01
3K0
java和javac编译运行java程序
eclipse运行java程序_如何在Eclipse中运行简单的Java程序?「建议收藏」
正如您可能从问题本身可以理解的那样,我是Java的新手。我进行了一个练习,编写一个Java程序,该程序接收一个字符,将其打印并输出Unicode表中的下一个字符。
全栈程序员站长
2022/09/15
2.7K0
Java程序运行原理分析
线程独占: 每个线程都会有它独立的空间,随线程的生命周期而创建和销毁 线程共享: 所有线程都能访问这块内存数据,随虚拟机或GC而创建和销毁 方法区
CodingDiray
2019/09/25
1K0
Java程序运行原理分析
java -jar运行MR程序
1、一般的做法都是使用hadoop jar的形式提交任务。 vi bin/hadoop.jar image.png 其实内部调用了RunJar.java 用来读取hadoop环境参数,配置文件等。
sparkle123
2018/07/04
1.4K0
如何简单运行Java程序
本章开始,我们需要下苦功打基础,目标是完成一个会员管理系统哦!如何运行Java程序,用java命令即可,一定不要忘了写main方法哦,一个java文件里面可以写很多个class。
剽悍一小兔
2021/04/09
4.4K0
如何简单运行Java程序
Java程序运行机制
    Java语言是一种特殊的高级语言,它既具有解释性语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。     可是,什么是编译型语言,什么是解释型语言呢。     编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。     现有的C、C++、Objective-C、Pascal等高级语言都属于编译型语言。     解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。     可以认为:每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器负责对源代码解释成特定平台的机器指令即可。解释性语言可以方便地实现源代码级的移植,但这是以牺牲程序执行效率为代价的。     现有的Ruby、Python等语言都属于解释型语言。     Java语言比较特殊,由Java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(也就是*.class文件)。当然,这种字节码不是可执行性的,必须使用Java解释器来解释执行。因此可以认为:Java语言既是编译型语言,也是解释型语言。或者说,Java语言既不是纯粹的编译型语言,也不是纯粹的解释性语言。Java程序的执行过程必须经过先编译、后执行两个步骤。
程序员云帆哥
2022/05/12
7810
Java程序运行机制
JAVA程序运行原理分析
PS:本次将JVM运行的核心逻辑进行了详细的解析,JVM运行原理中更底层实现,针对不同的操作系统或者处理器,会有不同的实现,说了运行时数据区,讲到了栈,指令码的执行过程。这也是JAVA能够实现【一定编写,处处运行】的原因。下次说下Java线程。
IT架构圈
2019/11/11
1.2K0
JAVA程序运行原理分析
Java官方笔记1编写运行Java程序
你可能已经迫不及待想安装Java,写个Java程序跑起来了。但是在这之前,有些概念需要提前了解,因为Java跟C、C++和Python都有点不一样。
dongfanger
2023/03/09
1K0
Docker针对运行JAVA程序的优化
大多数的服务现在已经使用容器启动 Jar包也不例外 很多人放在docker之后会发现 一段时间宿主机的运行内存变得很小,其实jar包运行用不了太大的内存,但是如果你不给他进行参数限制的话 ,他就会一直占用你的宿主机的 运行内存 导致你的宿主机内存变得很少
互联网-小阿宇
2022/11/21
6820
Docker针对运行JAVA程序的优化
如何利用Vbs 运行外部程序
1、Scripting.FileSystemObject —> 提供一整套文件系统操作函数
明明如月学长
2021/08/27
1.5K0
Docker针对运行JAVA程序的优化
大多数的服务现在已经使用容器启动 Jar包也不例外 很多人放在docker之后会发现 一段时间宿主机的运行内存变得很小,其实jar包运行用不了太大的内存,但是如果你不给他进行参数限制的话 ,他就会一直占用你的宿主机的 运行内存 导致你的宿主机内存变得很少
全栈程序员站长
2022/06/29
7040
Docker针对运行JAVA程序的优化
Python运行外部程序的几种方法
ShellExecute(hwnd,op,file,params,dir,bShow) - hwnd:父窗口的句柄,若没有则为0 - op:要进行的操作,为open,print or 空 - file:要运行的程序或脚本 - params: 要向程序传递的参数,如果打开的是文件则为空 - dir:程序初始化的目录 - bShow:是否显示窗口
py3study
2020/01/10
9240
idea打开工程无法运行java程序_如何运行一个java程序
有时候想运行别人的项目,但是别人的项目并非IDEA项目(甚至只有源码),当我们打开项目时候,并不能运行,我们却不知道怎么办。经过多次查找和尝试,最终终于能够运行起来了。记一下解决的方法。
全栈程序员站长
2022/11/11
3K0
idea打开工程无法运行java程序_如何运行一个java程序
java学习原理篇|java程序运行套路
我们生来平等 ? :寺水, 你说, 我们都是一样的吗? ? :从正态分布来看的话,除去前面和后面的,大多数人,生来差别并不大,可以简单认为,在出生那一刻是平等的. 人生忽然已过二十多载.从人生
微笑的小小刀
2020/09/29
4870
java学习原理篇|java程序运行套路

相似问题

在Java中尝试将input.txt文件转化为output.txt文件

10

Java,运行外部程序

22

在Java中更改Input.txt文件中的字符串而不创建Output.txt

37

如何用java运行外部java程序?

112

在java中运行外部程序

62
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档