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;
}
}
}
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ì đó. ;) –