///////////////////////////////////////////////////////////////////////////////
// 類Test是用來(lái)測(cè)試的,即一個(gè)進(jìn)程,它要求在控制臺(tái)進(jìn)行輸入輸出, 類Terminal模擬了Eclipse的控制臺(tái).
///////////////////////////////////////////////////////////////////////////////
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("Hi, Console");
System.out.println("Go, Console");
System.out.println("Please input ...");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println("Your input is: " + str);
}
}
///////////////////////////////////////////////////////////////////////////////
// 在類Terminal中有三個(gè)線程,一個(gè)用于監(jiān)聽(tīng)proc正常的輸出,一個(gè)監(jiān)聽(tīng)proc的錯(cuò)誤輸出,一個(gè)用于
// 監(jiān)聽(tīng)用戶輸入到控制臺(tái)的數(shù)據(jù),然后把這個(gè)數(shù)據(jù)輸出到proc里(對(duì)于proc來(lái)說(shuō)是輸入)
///////////////////////////////////////////////////////////////////////////////
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Scanner;
public class Terminal {
public static void main(String[] args) throws IOException, InterruptedException {
final Process proc = Runtime.getRuntime().exec("java Test");
// Normal input thread
new Thread() {
public void run() {
InputStream in = proc.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
try {
int ch = 0;
while ((ch = reader.read()) != -1) { // 不用readLine是為了防止print沒(méi)有回車的輸出
System.out.print((char) (ch));
}
System.out.println("Process end.");
// 當(dāng)讀取到-1時(shí),說(shuō)明proc已經(jīng)結(jié)束,所以本程序也應(yīng)該結(jié)束了(或者結(jié)束輸出線程)
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
// Error input thread
new Thread() {
public void run() {
InputStream in = proc.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
try {
while ((line = reader.readLine()) != null) {
System.err.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
// System.out.println("Sleep...");
// Thread.sleep(3000); // 程序在這里等待時(shí),在Eclipse的控制臺(tái)也能進(jìn)行輸入
// 當(dāng)proc代表的程序結(jié)束后,Eclipse才強(qiáng)制在控制臺(tái)不能進(jìn)行輸入
// Output thread.
// 在輸入中按下回車后取得當(dāng)前行字符(去掉傳進(jìn)來(lái)的,只取輸入的部分),然后轉(zhuǎn)對(duì)方.
new Thread() {
public void run() {
OutputStream out = proc.getOutputStream();
PrintWriter writer = new PrintWriter(out);
Scanner scanner = new Scanner(System.in);
String str = null;
while ((str = scanner.nextLine()) != null) {
writer.println(str);
writer.flush();
}
}
}.start();
}
}
///////////////////////////////////////////////////////////////////////////////
// 執(zhí)行方法:
///////////////////////////////////////////////////////////////////////////////
1. 先編譯好這兩個(gè)文件放在同一個(gè)文件夾里
2. 在終端里執(zhí)行: java Terminal
3. 看終端里的提示進(jìn)行操作