![](/img/trans.png)
[英]Tool to document differences between two different versions of an application
[英]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
,因此它幾乎與使用第一個構造函數相同。
BufferedInputStream
與BufferedReader
所以剩下的差異是那些之間的差異
new BufferedReader(new InputStreamReader(System.in))
和
new InputStreamReader(new BufferedInputStream(System.in));
它們在讀取數據的方式上略有不同。
第一個鏈將在每次需要輸入時填充 8192 個字符的緩沖區,從底層讀取器獲取每個字符,后者將從System.in
的字節解釋它。
每次需要輸入時,第二個鏈將填充 8192字節的緩沖區。 因此,當包裝讀取器需要下一個字符時,假設該字符由輸入中的兩個字節表示,並且該字符中只有一個字節在當前緩沖區中。 第二個字節將需要再次填充緩沖區。
我沒有經驗數據,但我認為鑒於Scanner
本身每次需要數據時都會填滿一個CharBuffer
,上述細微差別將是微不足道的。 事實上,我相信您可以安全地放棄使用BufferedReader
或BufferedInputStream
,只需將InputStreamReader
或System.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.