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

Aja*_*dav 40 java

Java BufferedReaderInputStreamReader类之间有什么区别?

amo*_*mod 43

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

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

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

希望能帮助到你.


Mic*_*yan 18

所述的InputStreamReader类适应型的InputStream(未解释的字节)到读取器类(解释为在某些字符集的字符字节),但不施加任何额外的缓冲.该的BufferedReader类需要一个阅读器类(大概无缓冲),并适用缓冲吧.

  • 缓冲意味着数据在称为"缓冲区"的数组中聚合.使用缓冲区可以提高读取效率,因为一次将大块网络从网络复制到缓冲区,即使您一次只从缓冲区中读取少量数据块也是如此.它还可以重新读取已经消耗的内容(通过移回缓冲区中的早期位置,即"标记"/"重置"执行的操作). (8认同)
  • "缓冲"是什么意思? (3认同)

Jam*_*son 18

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

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

考虑:

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

VS:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
in.read(); //
in.read(); //
// ...
in.read(); // hitting main memory a lot (fast!)
Run Code Online (Sandbox Code Playgroud)

文档:

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

这两个类实现了相同的接口Reader.因此,尽管你可以只使用InputStreamReaderBufferedReader,它可能会导致性能不佳.我们只是使用Decorator模式在这里,让我们结束了一个InputStreamReader现在有一个缓冲能力.


Cha*_*yan 7

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());       
    }
}
Run Code Online (Sandbox Code Playgroud)

当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());

    }
}
Run Code Online (Sandbox Code Playgroud)

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

结论:

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

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

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

BufferedReader 很快,因为它维护一个缓冲区,并且与从磁盘/标准输入检索数据相比,从缓冲区检索数据总是很快。