2012-01-30 79 views
4

我需要從我的Java控制檯應用程序執行帶有分頁的less命令。但是,我發現執行外部命令的唯一方法是Runtime.getRuntime().exec(),這需要我通過流寫入/讀取輸入/輸出。所以像cat這樣的命令工作(和less其實的行爲就像cat),但我需要分頁功能。如何通過Java控制檯應用程序進行分頁執行「less」?

在C中,我會使用system()。在Ruby中,Kernel.exec完成這項工作。

有什麼辦法可以在Java中完成這項工作嗎?

回答

1

當您使用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。

+0

這是有趣的 - 但有沒有什麼辦法讓這個tty沒有傳遞給它作爲參數?我可以將我的工具封裝在腳本中,但我寧願避免這種情況。 – futlib 2012-01-30 22:02:25

+0

你基本上需要一個用於POSIX函數'ttyname'的JNI包裝器。您可以自己創建一個或使用現有的POSIX Java庫(如JPosix)(http://kanga.org/jposix/)。它有一個名爲'ttyname'的方法,它將名稱作爲字節數組返回,沒有嘗試過雖然 – Joni 2012-01-31 12:52:05

+0

我已經把一個庫放在github上,它本質上是'ttyname'和'isatty'的包裝。仍然有點粗糙,但應該可以使用:https://github.com/joni/TTYUtil – Joni 2012-02-02 08:31:54

0

列表項

下面的程序將正常工作,首先它打印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(); 
      } 
     } 
    } 
} 
相關問題