簡體   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