BufferedReader.ready()的作用
时间: 2023-12-12 14:31:21 浏览: 201
BufferedReader.ready()方法用于判断是否可以从输入流中读取数据,如果输入流中有数据可以读取,则返回true,否则返回false。这个方法可以帮助我们在读取数据之前先判断输入流中是否有数据,避免因为读取数据而阻塞程序。需要注意的是,ready()方法并不保证输入流中一定有数据可读,因此在调用read()方法读取数据时,还需要进行异常处理。
相关问题
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秒后再次尝试读取
}
}
```
BufferedReader
BufferedReader是Java中的一个类,用于读取文本数据。它可以从字符输入流中读取文本,并缓存字符,以便于高效读取。通过使用缓存,它可以减少I/O操作的次数,从而提高读取效率。
BufferedReader的常用方法包括read()、readLine()、ready()等。其中,read()方法用于读取一个字符,readLine()方法用于读取一行字符,ready()方法用于检查是否还有字符可读。
示例代码:
```
FileReader fr = new FileReader("myfile.txt");
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
fr.close();
```
这段代码使用BufferedReader读取一个名为myfile.txt的文本文件,并将每一行输出到控制台。注意,使用完BufferedReader后,需要调用close()方法关闭文件流。
阅读全文