2010-10-04 203 views
6

我想了解的java文件中的一行是如下。使用Java掃描器讀取文件

return new Scanner(file).useDelimiter("\\Z").next(); 

該文件有望重返高達「輸入的目的,而是最後的終結者,如果有」每java.util.regex.Pattern中的文檔。但是會發生什麼,它只返回文件的前1024個字符。這是由正則表達式匹配器強加的限制嗎?這可以克服嗎?目前我正在使用文件讀取器進行。但我想知道這種行爲的原因。

+0

永遠不要使用掃描儀!真的,你會遇到很多麻煩。 – 2010-10-04 18:17:42

+8

@Martijn Courteaux - 謹慎提供掃描儀爲什麼不好的細節。 – whaley 2010-10-06 13:52:31

回答

2

嘗試包裹file對象在FileInputStream

+0

你能否編輯你的答案來解釋爲什麼這會有所幫助,以及潛在的問題是什麼?就目前而言,這僅僅是一條評論。 – 2017-02-05 21:05:09

5

我自己,我無法重現這一點。但我認爲我可以闡明發生了什麼。

在內部,掃描儀使用1024個字符的字符緩衝區。如果可能的話,掃描儀將默認從可讀的1024個字符中讀取數據,然後應用該模式。

問題出現在你的模式中......它總是會匹配輸入的結尾,但這並不意味着輸入流/數據的結束。當Java將您的模式應用於緩衝數據時,它會嘗試查找輸入結束的第一個匹配項。由於1024個字符在緩衝區中,因此匹配引擎將調用位置1024作爲分隔符的第一個匹配項,並將其作爲第一個標記符返回之前的所有內容。

因爲這個原因,我不認爲在掃描器中使用輸入結束錨點是有效的。畢竟,它可能是從無限的流中讀取的。

+0

嗨馬克,我認爲這是掃描儀不工作的正確原因。我正在投票答覆。使它正常工作的方法是標明正確的方法。謝謝您的回答。 – Sharmila 2010-10-04 17:55:05

1

Scanner旨在從文件中讀取多個基元。它確實無意讀取整個文件。

如果你不希望包括第三方庫,你最好不要循環在BufferedReader換行的文本FileReader/InputStreamReader,或循環在FileInputStream二進制數據。

如果使用第三方庫就好了,阿帕奇commons-ioFileUtils類,包含靜態方法readFileToStringreadLines文字和readFileToByteArray二進制數據..

0

您可以使用掃描儀類,打開掃描儀時,只需指定一個字符集,即:

Scanner sc = new Scanner(file, "ISO-8859-1"); 

的Java轉換從文件中讀取字節到使用指定的字符集,這是默認的(從底層OS)如果沒有被賦予字符(source )。目前還不清楚爲什麼Scanner只用默認的一個讀取1024個字節,而另一個則到達文件的末尾。無論如何,它工作正常!