2011-10-24 19 views
11
long end=System.currentTimeMillis()+60*10; 
    InputStreamReader fileInputStream=new InputStreamReader(System.in); 
    BufferedReader bufferedReader=new BufferedReader(fileInputStream); 
    try 
    { 
     while((System.currentTimeMillis()<end) && (bufferedReader.readLine()!=null)) 
     { 

     } 
     bufferedReader.close(); 
    } 
    catch(java.io.IOException e) 
    { 
     e.printStackTrace(); 
    } 

)私は実際に600ミリ秒で、それは読んで許可してはならないまでの時間を読み取るため上記をやってみましたが、BufferedReaderののreadlineのは、あなたがBufferedReader.available(でチェックすることができblocking.Pleaseヘルプノンブロッキング標準入力から読み込む方法は?

+0

私はあなたが何かを実際に何かを書くように長い間与えていると思います。 ;) –

答えて

3

です> 0読み込む文字がある場合。

String s; 

while((System.currentTimeMillis()<end)) 
{ 
    if (bufferedReader.available() > 0) 
     s += bufferedReader.readLine(); 
} 

bufferedReader.close(); 
+5

BufferedReaderで使用可能なメソッドはありませんが、準備が整いましたので、試してみました.Sibboをお願いします。 – pavi

+0

私は忘れていますが、available()メソッドはInputStreamによって実装されています; – Sibbo

+5

ready()は、データが存在するだけの線が準備できていることを保証しません。 readLine()はまだブロックする可能性があります。 http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready%28%29 –

0

BufferReader.readLine()は、行が1M文字のように非常に長い場合、非常に長い時間ブロックすることができます。

ファイルにこのような長い行が含まれていますか?

場合は、行を分割するか、BufferReader.read()などのchar単位の読み取りメソッドを使用する必要があります。

+0

を参照してください。実際には、少量のデータを特定の時間間隔で読み取ることはできませんでした。私は準備ができた方法でそれをやりました。あなたの思いやりをありがとう。 – pavi

2
long end=System.currentTimeMillis()+60*10; 
InputStreamReader fileInputStream = new InputStreamReader(System.in); 
BufferedReader bufferedReader = new BufferedReader(fileInputStream); 
try { 
    while ((System.currentTimeMillis() < end)) { 
     if (bufferedReader.ready()) { 
      System.out.println(bufferedReader.readLine()); 
     } 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if (bufferedReader != null) { 
      bufferedReader.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
6

BufferedReader.available()を使用すると、Sibboの提案は信頼できません。 available()状態のドキュメント:

戻り読み込むことができるバイト数の推定値 ...バッファを確保するために、このメソッドの戻り値を使用することが正しいことはありません。

つまり、一部の文字が実際に使用可能な場合でも、この値に頼ることはできません。たとえば、0を返すことができます。

私はいくつかの調査を行いました。外部からのプロセス入力ストリームを閉じることができない限り、別のスレッドからの非同期読み取りに頼る必要があります。ライン単位でブロックしないで読む方法の例を見つけることができますhere


更新:唯一の信頼できる方法は、一方で、ワーカースレッドを起動し、その中に実際の読み取りを行うことであろう

public class NonblockingBufferedReader { 
    private final BlockingQueue<String> lines = new LinkedBlockingQueue<String>(); 
    private volatile boolean closed = false; 
    private Thread backgroundReaderThread = null; 

    public NonblockingBufferedReader(final BufferedReader bufferedReader) { 
     backgroundReaderThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        while (!Thread.interrupted()) { 
         String line = bufferedReader.readLine(); 
         if (line == null) { 
          break; 
         } 
         lines.add(line); 
        } 
       } catch (IOException e) { 
        throw new RuntimeException(e); 
       } finally { 
        closed = true; 
       } 
      } 
     }); 
     backgroundReaderThread.setDaemon(true); 
     backgroundReaderThread.start(); 
    } 

    public String readLine() throws IOException { 
     try { 
      return closed && lines.isEmpty() ? null : lines.poll(500L, TimeUnit.MILLISECONDS); 
     } catch (InterruptedException e) { 
      throw new IOException("The BackgroundReaderThread was interrupted!", e); 
     } 
    } 

    public void close() { 
     if (backgroundReaderThread != null) { 
      backgroundReaderThread.interrupt(); 
      backgroundReaderThread = null; 
     } 
    } 
} 
1

:ここでは上記のリンクからコードの簡易版であります呼び出し元のスレッドは待ち時間を監視します。

ワーカースレッドが許可された時間以上待っている場合、マスタースレッドはそれを終了して例外をスローします。

関連する問題