缓冲读取器和InputStream的不同可能嵌套

时间:2016-06-14 20:00:00

标签: java bufferedreader fileinputstream bufferedinputstream

假设我想在文本级别上读取文件(在某些字符集中编码),而不是在字节级别上。所以我需要一个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。在将字节解码为文本后,将在字符级别完成缓冲。

但第三种情况有所不同,因为缓冲发生在字节读取和解码到文本之间。缓冲发生在字节被解码为文本之前。

问题是,这些案件之间是否有任何重要的区别?是否存在一个边缘情况,其中一个选项将优于另一个选项?

1 个答案:

答案 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不是一个好选择。