java BufferedReader 防止readline阻塞
时间: 2023-12-12 08:33:54 浏览: 54
为了防止`BufferedReader`的`readLine()`方法阻塞,可以使用`ready()`方法来检查是否有可用的输入。如果`ready()`方法返回`true`,则可以使用`readLine()`方法读取输入。如果`ready()`方法返回`false`,则可以使用`Thread.sleep()`方法暂停一段时间,然后再次检查是否有可用的输入。以下是一个示例代码:
```java
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (!br.ready()) {
Thread.sleep(200);
}
String input = br.readLine();
System.out.println("输入的内容是:" + input);
```
在上面的代码中,`ready()`方法用于检查是否有可用的输入。如果没有可用的输入,`Thread.sleep(200)`方法将暂停200毫秒,然后再次检查是否有可用的输入。如果有可用的输入,`readLine()`方法将读取输入并将其存储在`input`变量中,然后将其打印到控制台上。
相关问题
bufferedreader.readline()阻塞
`BufferedReader.readline()`是Java中可用于从输入流中读取一行文本的方法。它被称为"阻塞"是因为当调用这个方法时,如果没有可用的数据可以读取,程序将会被阻塞,即暂停执行直到有数据可用或者遇到异常。
当没有可用的数据时,`BufferedReader.readline()`方法将等待输入流中有足够的数据可供读取。这通常发生在以下情况下:
1. 输入流没有数据可供读取。例如,当程序正在读取一个空文件或者网络连接没有收到数据时,`BufferedReader.readline()`方法将一直阻塞。
2. 输入流的数据速度比程序读取的速度快。当程序没有及时读取输入流中的数据,输入流可能会积累一定量的数据。当程序准备好读取时,`BufferedReader.readline()`方法将会读取所有可用的数据行。
3. 输入流的数据被缓冲。在某些情况下,输入流可能会被缓冲以提高读取性能。当调用`BufferedReader.readline()`时,如果还没有足够的数据行在缓冲区中,此方法将阻塞直到有足够的数据行可供读取。
需要注意的是,阻塞是一种同步的行为,这意味着当程序在执行`BufferedReader.readline()`时会暂停执行,直到特定条件满足或者发生异常。因此,在使用`BufferedReader.readline()`方法时,我们需要注意处理可能的阻塞情况,例如使用多线程处理输入流或者设置适当的超时时间来避免长时间的阻塞。
BufferedReader.readline卡死
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秒后再次尝试读取
}
}
```