BufferedReader.readline卡死
时间: 2024-03-27 08:32:04 浏览: 168
BufferedReader的readLine()函数是一个阻塞函数,当没有数据可读取时,它会一直阻塞在那里,而不是返回null。这可能导致程序卡死的情况发生。为了避免这种情况,我们可以使用以下方法来解决:
1. 设置超时时间:可以使用setSoTimeout()方法设置读取超时时间,当超过指定时间后,readLine()函数会抛出SocketTimeoutException异常,从而避免程序卡死。
```java
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socket.setSoTimeout(5000); // 设置超时时间为5秒
String line = reader.readLine(); // 读取数据
```
2. 使用非阻塞模式:可以将Socket设置为非阻塞模式,这样readLine()函数在没有数据可读取时会立即返回null,而不会阻塞。
```java
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false); // 设置为非阻塞模式
channel.connect(new InetSocketAddress("localhost", 8080));
BufferedReader reader = new BufferedReader(new InputStreamReader(channel.socket().getInputStream()));
String line = reader.readLine(); // 读取数据,如果没有数据可读取,会立即返回null
```
3. 使用available()方法判断是否有数据可读取:可以使用available()方法判断输入流中是否有数据可读取,如果没有数据可读取,可以暂停一段时间后再次尝试读取。
```java
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
if (reader.ready()) {
String line = reader.readLine(); // 读取数据
break;
} else {
Thread.sleep(1000); // 暂停1秒后再次尝试读取
}
}
```
阅读全文