使用 Runtime对象的exec()方法可以运行平台上的其它程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程。Process类提供了如下三个方法,用于让程序和其子进程进行通信。

abstract InputStream getErrorStream​()
Returns the input stream connected to the error output of the process.(获取子进程的错误流)
abstract InputStream getInputStream​()
Returns the input stream connected to the normal output of the process.(获取子进程的输入流)                                                                     
abstract OutputStream getOutputStream​()
Returns the output stream connected to the normal input of the process.(获取子进程的输出流)
 package com.zyjhandsome.io;

 import java.io.*;

 public class ReadFromProcess {

     public static void main(String[] args) throws IOException {
// 运行javac命令,返回运行该命令的子进程
// 使用Runtime启动了javac程序,获得了运行该程序对应的子进程
Process p = Runtime.getRuntime().exec("javac");
try {
// 以p进程的错误流创建BufferedReader对象
// 这个错误流对本程序是输入流,对p进行是输出流
BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String buff = null;
// 采取循环方式来读取p进程的错误输出
while ((buff = br.readLine()) != null)
{
System.out.println(buff);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

  不仅如此,也可以通过Process的getOutputStream()方法获得向进程输入数据的流(该进程对Java程序是输出流,对子进程是输入流),如下程序实现了在Java程序中启动Java虚拟机运行另一个 Java程序,并向另一个Java程序中输入数据。

 package com.zyjhandsome.io;

 import java.io.*;
import java.util.*; public class WriteToProcess { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// 运行java ReadStandard命令,返回运行该命令的子进程
Process p = Runtime.getRuntime().exec("java ReadStandard");
// 以p进程的输出流创建PrintStream对象
// 这个输出流对本程序是输出流,对p进程则是输入流
try {
PrintStream ps = new PrintStream(p.getOutputStream());
// 向ReadStandard程序写入内容,这些内容将被ReadStandard读取
ps.println("普通字符串");
ps.println(new WriteToProcess()); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} //定义一个ReadStandard类,该类可以接受标准输入,
//并将标准输入写入out.txt文件。
class ReadStandard
{
public static void main(String[] args)
{
try(
// 使用System.in创建Scanner对象,用于获取标准输入
Scanner sc = new Scanner(System.in);
PrintStream ps = new PrintStream(new FileOutputStream("D:\\User_zhaoyingjun\\JavaSE\\Test\\WriteToProcess.txt")))
{
// 增加下面一行将只把回车作为分隔符
sc.useDelimiter("\n");
// 判断是否还有下一个输入项
while(sc.hasNext())
{
// 输出输入项
ps.println("键盘输入的内容是:" + sc.next());
}
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}
}

Java 输入/输出——Java虚拟机读写其它进程的数据的更多相关文章

  1. Java虚拟机读写其他进程的数据--Process对象

    使用Runtime对象的exec()方法可以运行平台上的其他程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程. Process类提供了3个方法,用于让程序和其 ...

  2. Java 输入/输出 反射

    Java  输入/输出   反射 输入输出和反射 一.数据流的基本概念 流一般分为 ( Input Stream ) 和输出流 ( Output Stream ) 两类,但这种划分并不是绝对的.比如一 ...

  3. Java输入/输出教程

    Java输入/输出(I/O)处理从源读取数据并将数据写入目标.通常,读取存储在文件中的数据或使用I/O将数据写入到文件中. java.io和java.nio包中包含处理输入/输出的Java类.java ...

  4. Java虚拟机访问读写其他进程的数据--RandomAccessFile

    RandomAccessFile 是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据.并且它支持“任意访问”的方式,程 ...

  5. Java 输入/输出——处理流(RandomAccessFile)

    RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据.与普通的输入/输出流不同的是,Ra ...

  6. Java 输入/输出——重定向标准输入/输出

    在System类中提供了如下三个重定向标准输入/输出方法. static void setErr​(PrintStream err) Reassigns the "standard" ...

  7. Java 输入/输出——处理流(BufferedStream、PrintStream、转换流、推回输入流)

    关于使用处理流的优势,归纳起来就是两点:(1)对于开发人员来说,使用处理流进行输入/输出操作更简单:(2)使用处理流执行效率更高. 1.BufferedInputStream/BufferedOutp ...

  8. JAVA输入/输出系统中的其他流学习笔记

    一.字节数组流 字节数组流类能够操作内存中的字节数组,它的数据是一个字节数组.字节数组流类本身适配器设计模式,它把字节数组类型转为流类型使得程序能够对字节数组进行读写操作. 1.ByteArrayIn ...

  9. Java 输入/输出——字节流和字符流

    1.流的分类 (1)输入流和输出流(划分输入/输出流时是从程序运行所在内存的角度来考虑的) 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 输入流主要由 ...

随机推荐

  1. 相关系数(CORRELATION COEFFICIENTS)会骗人?

    CORRELATION COEFFICIENTS We've discussed how to summarize a single variable. The next question is ho ...

  2. Atiitt 使用java语言编写sql函数或存储过程

    Atiitt 使用java语言编写sql函数或存储过程 1.1. java编写sql函数或存储过程的机制1 1.2. Java编写sp的优点1 1.3. 支持java源码,class文件,blog f ...

  3. 菜鸟教程之工具使用(九)——Git如何进行分支的merge操作

    今天继续我们的Git教程,Git杀手锏级的功能就是对于分支的管理,那么今天就来说说分支之间的merge操作.merge可以说是我们日常使用最多的操作之一,通常一个merge操作会包含commit.pu ...

  4. build MYSQL source code Using visual studio 2017

    https://dev.mysql.com/doc/refman/8.0/en/installing-source-distribution.html cmake .. -G "Visual ...

  5. MXNET:分类模型

    线性回归模型适用于输出为连续值的情景,例如输出为房价.在其他情景中,模型输出还可以是一个离散值,例如图片类别.对于这样的分类问题,我们可以使用分类模型,例如softmax回归. 为了便于讨论,让我们假 ...

  6. vue深入相应式原理

    Vue 最显著的特性之一便是不太引人注意的响应式系统(reactivity system).模型层(model)只是普通 JavaScript 对象,修改它则更新视图(view).这会让状态管理变得非 ...

  7. 从git上check out指定的文件夹至本地

    当项目过大时,从服务器上拉取项目是件很头疼的事情,那么就说说怎么只拉区某个或几个文件夹至本地. git clone -n git@172.0.0.10:test/test_platform.git c ...

  8. Scala学习笔记(二):object、伴生对象和基本类

    object object 是只有一个实例的类.它的定义与Java中的class类似,如: // 单例对象 object AppEntry { def main(args: Array[String] ...

  9. WebApi中的Session与Token间的处理对接

    首先,说起来创建session,一般会针对注册登录或者授权等情况: session 从字面上讲,就是会话.这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长 ...

  10. C++ Release编译时如何对某段代码不进行优化

    optimize#pragma optimize( "[optimization-list]", {on | off} ) Feature Only in Professional ...