訪問其他進程的輸入輸出
使用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類,並返回改程序的子進程。