2014-12-21 36 views
4

我有一個Java程序打印到標準輸出。如果輸出連接到head,那麼shell在完成任務後不會立即返回,而是等待Java程序完成其所有工作。Java編傳輸並立即返回

所以我的問題是:如何編寫Java程序,以便shell立即返回,就像cat ... | head

這是我的意思的例子:

這裏立即外殼收益爲head不花時間,打印前十行,不管bigfile.txt有多大:

time cat bigfile.txt | head 
... 
real 0m0.079s 
user 0m0.001s 
sys  0m0.006s 

這裏,而不是前十行快速打印但外殼不會返回,直到處理完所有文件:

time java -jar DummyReader.jar bigfile.txt | head 
... 
real 0m18.720s 
user 0m16.936s 
sys  0m2.212s 

DummyReader.jar很簡單,只要我可以使它:

import java.io.*; 

public class DummyReader { 

    public static void main(String[] args) throws IOException { 

     BufferedReader br= new BufferedReader(new FileReader(new File(args[0]))); 
     String line; 
     while((line= br.readLine()) != null){ 
      System.out.println(line); 
     } 
     br.close(); 
     System.exit(0); 
    } 

} 

我的設置:

java -version 
java version "1.6.0_65" 
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-10M4609) 
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode) 

在MacOS 10.6.8

+0

所以,你基本上需要'頭'來打敗你的Java程序後,它打印了前10行? –

+1

@ tobias_k是的,沒錯,我想要(或者任何下游)殺死java程序。 – dariober

+0

我不確定這是如何'頭'的作品。也許你寧願寫自己的「殺頭」功能。或者將一個參數傳遞給Java腳本,告訴它在x行後停止。 –

回答

2

這只是因爲你沒有println的調用後檢查錯誤。這是一個停止的修訂版本。儘管如此,它會變慢,因爲checkError()刷新了迄今爲止緩衝的任何輸出。

可能還有其他方法可以在不減速的情況下收到錯誤通知。我見過一些明確處理SIGPIPE信號的代碼,但我不知道這是否是最好的方式。

import java.io.*; 

public class DummyReader { 

    public static void main(String[] args) throws IOException { 

     BufferedReader br= new BufferedReader(new FileReader(new File(args[0]))); 
     String line; 
     int linecount = 0; 
     while((line= br.readLine()) != null){ 
      System.out.println(line); 
      if (System.out.checkError()) 
      { 
       System.err.println("Got some sort of error in the output stream"); 
       break; 
      } 
      linecount++; 
     } 
     br.close(); 
     System.err.println("Read " + linecount + " lines."); 
     System.exit(0); 
    } 

} 
+0

謝謝!這正是我所要求的。我會看到你提到的慢下來有多糟糕...... – dariober