Java面向对象系列[v1.0.0][JVM读写其他进程的数据]

访问其他进程的输入输出

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

  • InputStream getErrorStream():获取子进程的错误流
  • InputStream getInputStream():获取子进程的输入流
  • OutputStream getOutputStream():获取子进程的输出流
import java.io.*;

public class ReadFromProcess
{
	public static void main(String[] args)
		throws IOException
	{
		// 运行javac命令,返回运行该命令的子进程
		Process p = Runtime.getRuntime().exec("javac");
		try (
			// 以p进程的错误流创建BufferedReader对象
			// 这个错误流对本程序是输入流,对p进程则是输出流
			var br = new BufferedReader(new
				InputStreamReader(p.getInputStream())))
		{
			String buff = null;
			// 采取循环方式来读取p进程的错误输出
			while ((buff = br.readLine()) != null)
			{
				System.out.println(buff);
			}
		}
	}
}
import java.io.*;
import java.util.*;

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

ReadStandard是一个使用Scanner获取标准输入的类,该类提供了main()方法,可以被运行,但此处是由WriteToProcess类来运行ReadStandard类,Runtime的exec()方法运行了java ReadStandard命令,该命令将运行ReadStandard类,并返回改程序的子进程。

猜你喜欢

转载自blog.csdn.net/dawei_yang000000/article/details/106237982