繁体   English   中英

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

[英]What is the difference between Java's BufferedReader and InputStreamReader classes?

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

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

您可以想象读取一个字符(或字节)与读取一个大数字之间的效率差异。 一口气(或字节)的字符数。 使用BufferedReader,如果你想读取单个字符,它将存储内容以填充其缓冲区(如果它为空),并且对于进一步的请求,将直接从缓冲区读取字符,从而获得更高的效率。

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

希望能帮助到你。

从主内存读取比从磁盘/STDIN 读取快。

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

考虑:

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

对比:

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

文档

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

这两个类实现了相同的Reader接口。 因此,虽然您可以只使用InputStreamReader而没有BufferedReader ,但它可能会导致性能不佳 我们只是在这里使用了装饰器模式,因此我们最终得到了一个现在具有缓冲能力InputStreamReader

所述的InputStreamReader类适应型的InputStream (未解释的字节)到读取器类(字节解释为在某些字符集的字符),但不施加任何额外的缓冲。 BufferedReader类采用Reader类(大概是无缓冲的)并对其应用缓冲。

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 很快,因为它维护一个缓冲区,并且与从磁盘/标准输入检索数据相比,从缓冲区检索数据总是很快。

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

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

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

通常,Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。 因此,最好将 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

据我了解,BufferedReader 比 InputStreamReader 花费更少的时间将数据从字节转换为字符。所以我们更喜欢 BufferedReader 以获得更好的性能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM