如何设置 BufferedReader 以便只要有新数据到达就立即输出,而不是等待readLine方法返回?
时间: 2024-12-19 08:18:36 浏览: 6
在Java中,`BufferedReader`通常用于逐行读取输入流,但它本身并不支持即时通知新数据到达的功能。如果你想要实时监听新数据,可以考虑结合其他的并发技术,例如`BlockingQueue`或者`PipedInputStream/PipedOutputStream`。
一种常见的做法是使用`BufferedReader`配合`Poller`或者其他线程池技术,创建一个单独的接收线程来定期检查缓冲区是否有新的数据。例如:
```java
import java.io.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class ImmediateReader {
private final BufferedReader reader;
private final BlockingQueue<String> queue;
public ImmediateReader(BufferedReader reader) {
this.reader = reader;
this.queue = new LinkedBlockingQueue<>();
}
// 启动一个新的线程来处理数据
public void startReading() {
Thread thread = new Thread(() -> {
String line;
try {
while ((line = reader.readLine()) != null) {
queue.offer(line);
// 可能需要同步队列操作以保证线程安全
synchronized (queue) {
queue.notify(); // 当有新数据时唤醒阻塞的线程
}
}
} catch (IOException e) {
e.printStackTrace();
}
});
thread.start();
}
// 主线程通过队列获取新数据
public void getNewData() throws InterruptedException {
String newData = queue.take(); // 阻塞直到有数据可用
System.out.println("Received data: " + newData);
}
}
```
在这个例子中,`startReading`方法启动一个线程不断地从`BufferedReader`读取,并将每行数据放入队列中。当有新数据时,它会调用`notify()`方法唤醒正在等待的主线程。然后,`getNewData`方法会在队列中有新数据时立即返回。
阅读全文