关于“Java IO及BufferedReader.readline()出现的Bug”,我们需要注意以下两点:
1. Java IO 中的缓存问题
Java的IO操作是基于缓存进行的,而很多读取函数如BufferedReader. readline()是以换行符作为结束标记的,但是我们在编写代码时常常忽略了特殊情况的处理,导致出现了缓存问题,例如一次读取操作并未读取完整行,而下一次读取又无法续读上一行的后半部分,导致读取出错。
2. BufferedReader.readline() 读取空文件时的问题
当使用BufferedReader. readline()读取空文件时,其中的返回值可能会是null,从而导致异常的出现,我们需要特别注意这种情况。
接下来,我们将通过两个实例分别介绍以上两点。
例一: BufferedReader.readline()的缓存问题
如下代码所示:
import java.io.*;
public class Test {
public static void main(String[] args) {
try {
String line;
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我们读取的文件内容如下(注意,最后一行没有换行符):
Hello
World
Hello
Java
I'm fine
And you
Goodbye
代码执行结果如下:
Hello
World
Hello
Java
I'm fine
And you
这是因为,在执行第一次String line = br.readLine()时,BufferedReader只读取了“Hello”一行,并且将“Hello\n”存入了缓存中,当第二次执行该语句时,由于并未再读取到换行符,导致BufferedReader无法确定该行是否已经读取结束,因此直接返回了null值,导致我们读取文件的操作异常终止。
这种情况的解决方案有很多,我们这里介绍两种:
方案一:判断缓存是否存在
import java.io.*;
public class Test {
public static void main(String[] args) {
try {
String line;
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null || br.ready()) { // 当缓存中存在未读取的字符时,继续读取
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方案二:使用Scanner代替BufferedReader
import java.io.*;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
try {
Scanner scanner = new Scanner(new File("test.txt"));
while(scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
两种方案都可以正常读取文件中的数据。
例二:lBufferedReader.readline() 读取空文件时的问题
下面的代码将读取空文件,并使用BufferedReader. readline()进行逐行读取操作:
import java.io.*;
public class Test {
public static void main(String[] args) {
try {
String line;
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
此时,因为没有任何内容,程序会抛出NullPointerException异常。
为了解决这个问题,我们可以添加特判来判断文件是否为空:
import java.io.*;
public class Test {
public static void main(String[] args) {
try {
String line;
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
while (br.ready() && (line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在原来的代码中我们修改了while条件的判断:当缓存中存在未读取的字符并且当前行不是空行时才执行循环体。
以上就是关于Java IO和BufferedReader.readline()出现的Bug的详细攻略。希望对您有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java IO及BufferedReader.readline()出现的Bug - Python技术站