2011-10-24 29 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(); 
    } 

Tôi thực sự đã cố gắng thực hiện ở trên để đọc trong 600 mili giây thời gian sau đó nó không nên cho phép đọc nhưng readline của BufferedReader là giúp đỡ blocking.Pleaselàm thế nào để đọc từ đầu vào tiêu chuẩn không chặn?

+0

Tôi giả sử bạn sẽ cung cấp cho người dùng dài để thực sự viết điều gì đó. ;) –

Trả lời

3

Bạn có thể kiểm tra với BufferedReader.available()> 0 nếu có ký tự để đọc.

String s; 

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

bufferedReader.close(); 
+5

Không có phương pháp nào được gọi là có sẵn trong BufferedReader nhưng chúng tôi đã sẵn sàng vì vậy tôi đã thử với nó và đã làm nó. Cảm ơn bạn sibbo. – pavi

+0

Ok, tôi quên, phương thức available() được thực hiện bởi InputStream;) – Sibbo

+5

ready() không đảm bảo rằng một dòng đã sẵn sàng chỉ có một số dữ liệu có mặt. readLine() vẫn có thể chặn. xem http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready%28%29 –

0

BufferReader.readLine() có thể chặn trong một thời gian rất dài nếu một dòng cực dài như ký tự 1 triệu.

Tệp của bạn có chứa các dòng dài như vậy không?

Nếu có, bạn có thể phải chia nhỏ các dòng hoặc sử dụng các phương thức đọc trên mỗi byte như BufferReader.read().

+0

Không thực sự tôi chỉ đọc dữ liệu số lượng nhỏ nhưng trong khoảng thời gian cụ thể. Tôi đã làm nó thông qua phương pháp đã sẵn sàng. Cảm ơn bạn đã suggession của bạn. – 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

Sử dụng BufferedReader.available() theo đề xuất của Sibbo không đáng tin cậy. Tài liệu của available() trạng thái:

Returns ước tính của số byte có thể được đọc ... Nó không bao giờ là đúng để sử dụng giá trị trả về của phương pháp này để phân bổ một bộ đệm.

Nói cách khác, bạn không thể dựa vào giá trị này, ví dụ: nó có thể trả về 0 ngay cả khi một số ký tự thực sự có sẵn.

Tôi đã thực hiện một số nghiên cứu và trừ khi bạn có thể đóng luồng đầu vào quy trình từ bên ngoài, bạn cần phải sử dụng phần đọc không đồng bộ từ một chuỗi khác. Bạn có thể tìm thấy ví dụ về cách đọc mà không chặn dòng theo dòng here.


Cập nhật: Đây là một phiên bản đơn giản của các mã từ liên kết ở trên:

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

Cách đáng tin cậy duy nhất là để bắt đầu một sợi công nhân và làm việc đọc thực tế bên trong nó, trong khi chuỗi người gọi sẽ theo dõi độ trễ.

Nếu chuỗi công nhân đang đợi lâu hơn cho phép, luồng chính sẽ chấm dứt và ném một ngoại lệ.

Các vấn đề liên quan