1、由于不知道目标程序的输入输出顺序,因此只能建立两个单独的线程分别处理输入和输出,这样输入和输出就不会阻塞了。但是有些目标程序要求有特定的输入输出顺序,而经过这个类封装的结果是在任何状态下都可以输入,程序的任何输出也会被马上反映出来,构造通用类的第一个问题。
2、不能直接使用I/O重定向,在最开始的时候我是考虑直接使用I/O重定向的,但是实际的情况是Process的I/O的定义刚好和我的预想相反,
我们从 Process取得的InputStream实际上是它的输出,而取得的OutputStream是它的输入,这样就无法进行I/O重定向了,必须我们进行编码来读取程序的输出和写入控制台的输入。(这里的I/O重定向是指想将它的I/O直接重定向到系统的I/O)
3、写入控制台的输入:
outputStream.write
( (reader.readLine()+
"\n").getBytes());
outputStream.flush();
这里有两个问题值得注意:第一个是我们在控制台输入一行数据以后按下回车,那么语句reader.readLine()可以正确的得到你的输入,为什么要加那个换行符呢?
这是在测试的时候发现的问题,在以native2ascii作为例子的时候发现
不加这个的话它不能得到控制台的输入,但是我在替那位网友解决的问题的时候他的程序则没有这个问题,因此猜想可能是因为有的程序要求读取的一整行的数据(例如native2ascii),而大部分的命令行程序在编码的时候读取的是整数这样的值或者其他类型的值,他们是以空格或者其他的字符分隔的,因此就不需要那个额外的换行符(例如那位网友的程序读取的是一元二次方程的三个系数)。
另外一个问题
就是flush方法的使用,在最开始的时候没有想到要这样刷新进去,无论是否加换行符外部程序都无法读取写入的输入,后来才想到要调用一下这个方法。这个也是在我们输出的时候应该注意的一个问题,有些需要马上反应出来的输出一般都在写入以后要调用它,否则输出/输入不能马上反应出来。
4、对于程序的输出,最开始我是构造的一个BufferedReader想以行为单位输出,对于那位网友的程序,结果证明不是很好用,但是以 native2ascii作为例子运行又没有问题。这个估计和外部程序的代码也有关系,如果外部程序没有输出换行符可能使用BufferedReader 就会有问题。但是通过直接读取输出就没有问题了。另外需要注意的就是:
System.out.println(lineNumber+":"+new
String(buffer, 0, count-1));
中严格来说应该是:
System.out.println(lineNumber+":"+
new String(buffer, 0, count));
之所以减一是因为读取输入的时候人为的多加了一个换行符,如果这个地方不减一就会多输出一个空行。
分享到:
相关推荐
### jsp中HttpClient中的POST方法实例详解 #### 一、概述 在Web开发中,特别是使用JSP(Java Server Pages)进行服务器端编程时,经常需要通过HTTP客户端库(如HttpClient)来发起网络请求,包括GET和POST请求。...
这样,用户只需下载JAR和JAD文件,就能在支持Java的设备上安装和运行程序。 总的来说,Java的运行机制和文件格式设计旨在提供高效、安全、跨平台的软件开发环境。通过编译器将源代码转化为字节码,然后在JVM上解释...
在"java程序控制与数组 详解 java实例20"中,我们可能会看到如何结合使用这些概念。可能的情况包括: 1. 使用for循环遍历数组,对每个元素进行操作,如计算平均值或查找最大值。 2. 使用if或switch语句根据数组元素...
本资源"JAVA编程实例大全及详解答案(50例)"显然是为了帮助初学者和有经验的开发者深入理解Java语言并提升编程技能。通过50个具体的实例,读者可以学习到如何解决实际问题,理解各种编程概念,并且每个实例都提供了...
【JAVA实例详解教程】是一份全面且深入的教育资源,旨在帮助初学者以及有一定基础的JAVA开发者更好地理解和掌握JAVA编程技术。教程涵盖了JAVA开发中的多个重要领域,提供了丰富的实例,使得学习过程更加直观和实践化...
在Java中,线程是程序的单一顺序控制流,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。一个进程可以包含多个线程,它们共享同一块内存空间,通过同步机制避免数据竞争。 创建Java线程有多种...
Java中的main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法。这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void类型的,...
《Java基础与案例实例详解》是一本针对Java编程语言初学者的详尽教程。它深入浅出地介绍了Java的核心概念和技术,旨在为读者提供坚实的编程基础,并通过丰富的案例实例帮助理解与应用。以下是对该书内容的详细解读:...
在这个“Java语言基础 详解 java实例20”中,我们将深入探讨Java的核心概念和技术,这些内容将帮助初学者建立坚实的编程基础。 首先,Java是一种面向对象的编程语言,它的设计目标是具有平台无关性,这意味着编写一...
《J2EE经典实例详解》是一本专注于Java企业级应用开发的实践指南,它通过一系列精选的实例,帮助开发者深入理解和熟练运用J2EE技术。J2EE(Java 2 Platform, Enterprise Edition)是Java平台的企业版,为构建分布式...
Java 反射机制实例详解是一种动态语言机制,允许在程序运行时加载、探知和使用编译期间完全不知道的类、生成其对象实体,调用其方法或者对属性设值。下面是 Java 反射机制实例详解的知识点: 1. 反射机制的概念 ...
描述中提到这是“初学者上手”的好资料,这意味着它可能涵盖了一些基础概念,如Java的基础语法、面向对象编程思想,以及如何在Java环境中设置和运行Swing程序。此外,初学者通常会接触到如何导入和使用Swing库,编写...
【Java程序详解】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(后被Oracle公司收购)于1995年推出。它的设计目标是具有跨平台性、可移植性、安全性和高效性,使得开发者可以编写一次代码,到处...
接着,运行程序,输入`java Hello`,你应该能看到“Hello, World!”的输出。 这里涉及到的classpath主要用于指定Java虚拟机寻找类文件的路径。当你有多个包或者类库时,需要正确设置classpath以确保Java能找到对应...
如果没有显式设定,Java会使用当前系统时间作为种子,确保每次程序运行时生成不同的随机序列。 线性同余法是生成伪随机数的常见算法之一,其数学表达式通常为 `Xn+1 = (a * Xn + c) mod m`,其中 `Xn` 是当前的...
提供了课程中可能需要用到的各种库文件,包括Java EE规范的实现库和其他第三方库,以便于在本地环境中运行和调试课程示例。 通过这些实例,你将能够熟练掌握Java EE开发环境的搭建,了解各技术之间的协作方式,...
"java学习资料,实例详解"这样的资源通常包含了深入理解Java编程的基础概念、语法以及实际应用的关键知识点。 首先,Java的基础知识包括: 1. **基本语法**:变量、数据类型(如整型、浮点型、字符型、布尔型)、...
《Java2编程详解》这本书是Java编程领域的一部经典之作,特别版的使用指南深入剖析了Java 2平台的核心技术和编程方法。这本书旨在帮助开发者掌握Java语言的基础以及高级特性,从而能够有效地进行软件开发。 首先,...
J2ME的游戏程序开发则是利用J2ME平台开发可在手机等移动设备上运行的简单游戏。由于设备资源有限,J2ME游戏通常比PC游戏或游戏机游戏简单许多。下面将围绕J2ME游戏程序开发的关键知识点进行详细解释。 1. J2ME的...