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類,並返回改程序的子進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章