假设我想在文本级别上读取文件(在某些字符集中编码),而不是在字节级别上。所以我需要一个Reader
类。
我们还要说我希望缓解读数。我至少看到三种方法。
public static void main(String[] args) throws Exception {
BufferedReader r1 = new BufferedReader(new FileReader("foo.txt"));
BufferedReader r2 = new BufferedReader(new InputStreamReader(new FileInputStream("foo.txt")));
InputStreamReader r3 = new InputStreamReader(new BufferedInputStream(new FileInputStream("foo.txt")));
}
r1和r2几乎相同,因为FileReader
继承自InputStreamReader
并且实际上在其基类中放置了InputStream
。在将字节解码为文本后,将在字符级别完成缓冲。
但第三种情况有所不同,因为缓冲发生在字节读取和解码到文本之间。缓冲发生在字节被解码为文本之前。
问题是,这些案件之间是否有任何重要的区别?是否存在一个边缘情况,其中一个选项将优于另一个选项?答案 0 :(得分:1)
FileReader
的实施:
public class FileReader extends InputStreamReader {
public FileReader(String fileName) throws FileNotFoundException {
super(new FileInputStream(fileName));
}
}
所以你看,你的前两行产生完全相同的链。
第三种选择对性能不利。 InputStreamReader
必须执行从byte
流到char
流的字符编码转换,这在逐字节级别上会很慢,但在块中会更快。
请参阅InputStreamReader
的javadoc:
每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。为了有效地将字节转换为字符,可以从基础流中提取比满足当前读取操作所需的更多字节。
为了获得最高效率,请考虑在BufferedReader中包装InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
选择选项1.它比选项2短,并且完全相同,选项3不是一个好选择。