簡體   English   中英

兩個版本的 Scanner 有什么區別?

[英]What are the differences between two versions of Scanner?

這些從控制台讀取輸入的方法有什么區別?

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

Scanner in = new Scanner(new BufferedInputStream(System.in));

以及有什么優點和缺點?

Scanner構造函數

就這些電話而言,沒有太大區別。

您使用的Scanner的第一個構造函數Scanner(Readable)將表示傳入字符序列的對象作為參數,可以使用CharBuffer讀取該對象。

您使用的Scanner的第二個構造函數Scanner(InputStream)將表示傳入字節序列的對象作為參數。

需要強調的是,字節不是字符。 根據字符編碼,字符可能由不同的字節序列表示,並且每個字符可能跨越多個字節。

在內部,第二個構造函數立即用InputStreamReader包裝參數 - 這是一個提供字符數據的Readable ,因此它幾乎與使用第一個構造函數相同。

BufferedInputStreamBufferedReader

所以剩下的差異是那些之間的差異

new BufferedReader(new InputStreamReader(System.in))

new InputStreamReader(new BufferedInputStream(System.in));

它們在讀取數據的方式上略有不同。

第一個鏈將在每次需要輸入時填充 8192 個字符的緩沖區,從底層讀取器獲取每個字符,后者將從System.in的字節解釋它。

每次需要輸入時,第二個鏈將填充 8192字節的緩沖區。 因此,當包裝讀取器需要下一個字符時,假設該字符由輸入中的兩個字節表示,並且該字符中只有一個字節在當前緩沖區中。 第二個字節將需要再次填充緩沖區。

我沒有經驗數據,但我認為鑒於Scanner本身每次需要數據時都會填滿一個CharBuffer ,上述細微差別將是微不足道的。 事實上,我相信您可以安全地放棄使用BufferedReaderBufferedInputStream ,只需將InputStreamReaderSystem.in直接提供給Scanner ,它就會處理緩沖。

指定輸入的字符集

如果您需要為您的輸入使用特定的字符集,那將會有所不同。 例如,如果您想確保傳入的字節流被解釋為UTF-8 ,您可以使用:

Scanner in = new Scanner(new InputStreamReader(System.in,StandardCharsets.UTF_8));

否則,輸入字節將被解釋為您的默認字符集,可能不一定是UTF-8

Scanner另一個構造函數也允許使用普通的InputStream進行此操作:

Scanner in = new Scanner(System.in, "UTF-8");

這也將立即用InputStreamReader包裝System.in ,所以沒有太大區別。

我認為回答這些問題的最好方法是檢查實際實現的來源。 您可以從這里下載源代碼: http : //download.java.net/openjdk/jdk8/或谷歌特定類:“java.util.Scanner 源代碼”。

在這種情況下,匹配源:

public Scanner(InputStream source) {
   this(new InputStreamReader(source), WHITESPACE_PATTERN);
}

您可以使用此代碼段實現相同的目的:

Scanner in = new Scanner(new BufferedReader(new InputStreamReader(new BufferedInputStream(System.in))));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM