我需要從我的Java控制檯應用程序執行帶有分頁的less
命令。但是,我發現執行外部命令的唯一方法是Runtime.getRuntime().exec()
,這需要我通過流寫入/讀取輸入/輸出。所以像cat
這樣的命令工作(和less
其實的行爲就像cat
),但我需要分頁功能。如何通過Java控制檯應用程序進行分頁執行「less」?
在C中,我會使用system()
。在Ruby中,Kernel.exec完成這項工作。
有什麼辦法可以在Java中完成這項工作嗎?
我需要從我的Java控制檯應用程序執行帶有分頁的less
命令。但是,我發現執行外部命令的唯一方法是Runtime.getRuntime().exec()
,這需要我通過流寫入/讀取輸入/輸出。所以像cat
這樣的命令工作(和less
其實的行爲就像cat
),但我需要分頁功能。如何通過Java控制檯應用程序進行分頁執行「less」?
在C中,我會使用system()
。在Ruby中,Kernel.exec完成這項工作。
有什麼辦法可以在Java中完成這項工作嗎?
當您使用Runtime.exec()
執行外部進程時,其標準輸入和輸出流未連接到運行Java程序的終端。你可以使用shell重定向來連接它,但首先你需要知道使用哪個終端。沒有辦法使用標準API來查找終端,但是可能您可以找到一個可以實現它的開源庫。
地看到,這是可以做到,這個程序打開自己在less
:
public class Test {
public static void main(String[] args) throws Exception {
Process p = Runtime.getRuntime().exec(
new String[] {"sh", "-c",
"less Test.java < "+args[0] + " > "+args[0]});
System.out.println("=> "+p.waitFor());
}
}
要運行它,你應該使用java Test $(tty)
。 tty
程序打印連接到其stdin的終端的名稱。
我不太確定這個解決方案的可移植性;至少它適用於Linux。
列表項
下面的程序將正常工作,首先它打印10線,然後按回車鍵,將打印下一行,直到文件末尾。 運行程序一樣 的java減$文件名
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Less
{
public static void main(String args[]) throws IOException
{
FileReader reader = new FileReader(args[0]);
BufferedReader buff = new BufferedReader(reader);
String readLine;
int lineCount = 0;
while ((readLine = buff.readLine()) != null)
{
System.out.println(readLine);
lineCount++;
if (lineCount > 10)
{
Scanner scanner = new Scanner(System.in);
scanner.nextLine();
}
}
}
}
這是有趣的 - 但有沒有什麼辦法讓這個tty沒有傳遞給它作爲參數?我可以將我的工具封裝在腳本中,但我寧願避免這種情況。 – futlib 2012-01-30 22:02:25
你基本上需要一個用於POSIX函數'ttyname'的JNI包裝器。您可以自己創建一個或使用現有的POSIX Java庫(如JPosix)(http://kanga.org/jposix/)。它有一個名爲'ttyname'的方法,它將名稱作爲字節數組返回,沒有嘗試過雖然 – Joni 2012-01-31 12:52:05
我已經把一個庫放在github上,它本質上是'ttyname'和'isatty'的包裝。仍然有點粗糙,但應該可以使用:https://github.com/joni/TTYUtil – Joni 2012-02-02 08:31:54