bufferedreader readline 阻塞
时间: 2023-04-27 13:01:54 浏览: 481
BufferedReader的readLine方法会阻塞,直到读取到一行完整的数据或者读取到流的末尾。这是因为readLine方法是按行读取数据的,需要读取到一行完整的数据才能返回。如果读取的数据不足一行,readLine方法会一直等待直到读取到足够的数据。因此,在使用BufferedReader的readLine方法时,需要注意阻塞的情况,可以使用多线程或者设置超时时间来避免阻塞。
相关问题
为什么BufferedReader readline()一直在阻塞状态
BufferedReader的readLine()方法会一直阻塞的原因是因为它在读取输入流时需要等待换行符或回车符的出现,如果输入流中没有这些符号,那么readLine()方法就会一直等待,导致阻塞。为了避免这种情况,可以使用BufferedReader的ready()方法来检查输入流是否准备好被读取,或者使用其他的读取方法来替代readLine()方法。
以下是两种解决方法的示例代码:
1. 使用ready()方法检查输入流是否准备好被读取:
```java
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while (!br.ready()) {
// 等待输入流准备好被读取
}
line = br.readLine();
```
2. 使用read()方法替代readLine()方法:
```java
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] buffer = new char[1024];
int len = 0;
StringBuilder sb = new StringBuilder();
while ((len = br.read(buffer)) != -1) {
sb.append(buffer, 0, len);
if (sb.indexOf("\r\n") != -1) {
// 找到换行符或回车符,停止读取
break;
}
}
String line = sb.toString().trim();
```
BufferedReader.readLine阻塞
`BufferedReader.readLine()` 是 Java 中用于从输入流(如文件、网络连接)读取一行文本的方法,但它会阻塞直到读取到新的一行数据或遇到 EOF(End Of File)。当调用 `readLine()` 时,如果缓冲区中没有可用的数据,方法会暂停执行,直到接收到新的数据或者超时。
这种阻塞行为使得程序能按照数据的到达顺序逐行处理,适合用于处理按行传输的文本流。如果你的应用需要快速响应,而又不确定下一行何时到来,这可能会导致性能问题或用户感知的延迟。因此,在设计时需要权衡是否希望线程在此期间保持活动或者设置适当的超时策略来避免长时间阻塞。
阅读全文