Java的BufferedReader和InputStreamReader类之间有什么区别?

时间:2011-09-11 06:15:48

标签: java

Java的BufferedReaderInputStreamReader类之间有什么区别?

7 个答案:

答案 0 :(得分:38)

BufferedReader是“InputStreamReader / FileReader”的包装器,它在每次调用本机I / O时缓冲信息。

你可以想象读取一个字符(或字节)与读取大数字的效率差异。一行(或字节)中的字符数。使用BufferedReader,如果您希望读取单个字符,它将存储内容以填充其缓冲区(如果它是空的),对于进一步的请求,将直接从缓冲区读取字符,从而实现更高的效率。

InputStreamReader将字节流转换为字符流。它读取字节并使用指定的字符集将它们解码为字符。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。

希望它有所帮助。

答案 1 :(得分:17)

InputStreamReader类将类型InputStream(未解释的字节)调整为Reader类(在某些字符集中解释为字符的字节),但不应用任何其他缓冲。 BufferedReader类接受Reader类(可能是无缓冲的)并对其应用缓冲。

答案 2 :(得分:17)

从主存储器读取比从磁盘/ STDIN读取更快。

BufferedReader使用一种称为缓冲的技术,它允许我们通过将块复制到主内存来减少从磁盘/ STDIN读取的频率。

考虑:

BufferedReader in = new InputStreamReader(System.in);
in.read(); // 
in.read(); //
// ...
in.read(); // could be hitting the disk/STDIN a lot (slow!)

VS

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
in.read(); //
in.read(); //
// ...
in.read(); // hitting main memory a lot (fast!)

来自documentation

  

如果没有缓冲,read()每次调用都可能导致从[disk / STDIN]读取字节,转换为字符,然后返回,这可能效率非常低

这两个类实现了Reader的相同接口。因此,虽然只使用InputStreamReader而不使用BufferedReader,但可能会导致性能不佳。我们只是在这里使用decorator pattern,以便最终得到InputStreamReader 现在具有缓冲功能

答案 3 :(得分:3)

BufferedReader从指定的流中读取几个字符并将其存储在缓冲区中。这使输入更快。

InputStreamReader只读取指定流中的一个字符,其余字符仍保留在流中。

示例:

class NewClass{    
    public static void main(String args[]) throws IOException{

        BufferedReader isr = new BufferedReader(new InputStreamReader(System.in));

        Scanner sc = new Scanner(System.in);

        System.out.println("B.R. - "+(char)isr.read());
        System.out.println("Scanner - " + sc.nextLine());       
    }
}

当执行isr.read()语句时,我输入了输入“hello”,并在屏幕上打印了“hello”字符“h”。如果这是InputStreamReader,则剩余的字符“ello”将保留在System.in流中,而sc.nextLine()将打印它们。但在这种情况下,它不会发生,因为BufferedReader从System.in流中读取所有“hello”字符并将它们存储在自己的个人缓冲区中,因此当sc.nextLine()为时,System.in流保持为空。执行。

代码:

class NewClass{    

    public static void main(String args[]) throws IOException{

        InputStreamReader isr = new InputStreamReader(System.in);

        Scanner sc = new Scanner(System.in);

        System.out.println("I.S.R. - "+(char)isr.read());
        System.out.println("Scanner - " + sc.nextLine());

    }
}

在这种情况下,InputStreamReader只读取一个字符用于“hello”输入,剩下的“ello”仍保留在System.in流中,这些字符由sc.nextLine()打印;

结论:

BufferedReader从输入流中读取几个字符(即使我们只需要一个字符,它将读取更多字符)并将它们存储在缓冲区中。这就是它被称为BufferedReader的原因。我无法弄清楚它一次读取了多少字符。当我为这个答案进行测试时,它从3到10不等。

InputStreamReader只从输入流中读取一个字符,剩余的字符仍保留在流中。在这种情况下没有中间缓冲区。

当一个或多个线程或对象想要从System.in读取字符时,那么在这种情况下应该使用InputStreamReader,因为它只读取一个字符,剩下的可以被其他对象或线程使用。

BufferedReader很快,因为它维护一个缓冲区,与从disk / stdin中检索数据相比,从缓冲区检索数据总是很快。

答案 4 :(得分:1)

BufferedReader 从输入流中读取几个字符,并将它们存储在缓冲区中。

InputStreamReader 从输入流中仅读取一个字符,其余字符仍保留在流中,因此在这种情况下没有缓冲区。

答案 5 :(得分:1)

  

BufferedReader是Java中的一个类,它从字符输入流中读取文本,并缓冲字符,以便有效读取字符,行和数组。可以指定缓冲区大小。如果没有,则可以使用预定义的默认大小。

     

通常,由读取器发出的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,最好将BufferedReader包装在其read()操作可能会很昂贵的任何Reader上,例如FileReaders和InputStreamReaders。例如,

FileReader reader = new FileReader(“MyFile.txt”);
BufferedReader bufferedReader = new BufferedReader(reader);
     

将缓冲来自指定文件的输入。如果不进行缓冲,则每次调用read()或readLine()都会导致从文件中读取字节,将其转换为字符,然后返回,这可能会非常低效。

来源:https://medium.com/@isaacjumba/why-use-bufferedreader-and-bufferedwriter-classses-in-java-39074ee1a966

答案 6 :(得分:0)

据我所知,而不是InputStreamReader BufferedReader将数据从字节转换为character所花费的时间更少。所以我们更喜欢BufferedReader以获得更好的性能