我想了解的java文件中的一行是如下。使用Java掃描器讀取文件
return new Scanner(file).useDelimiter("\\Z").next();
該文件有望重返高達「輸入的目的,而是最後的終結者,如果有」每java.util.regex.Pattern中的文檔。但是會發生什麼,它只返回文件的前1024個字符。這是由正則表達式匹配器強加的限制嗎?這可以克服嗎?目前我正在使用文件讀取器進行。但我想知道這種行爲的原因。
我想了解的java文件中的一行是如下。使用Java掃描器讀取文件
return new Scanner(file).useDelimiter("\\Z").next();
該文件有望重返高達「輸入的目的,而是最後的終結者,如果有」每java.util.regex.Pattern中的文檔。但是會發生什麼,它只返回文件的前1024個字符。這是由正則表達式匹配器強加的限制嗎?這可以克服嗎?目前我正在使用文件讀取器進行。但我想知道這種行爲的原因。
嘗試包裹file
對象在FileInputStream
你能否編輯你的答案來解釋爲什麼這會有所幫助,以及潛在的問題是什麼?就目前而言,這僅僅是一條評論。 – 2017-02-05 21:05:09
我自己,我無法重現這一點。但我認爲我可以闡明發生了什麼。
在內部,掃描儀使用1024個字符的字符緩衝區。如果可能的話,掃描儀將默認從可讀的1024個字符中讀取數據,然後應用該模式。
問題出現在你的模式中......它總是會匹配輸入的結尾,但這並不意味着輸入流/數據的結束。當Java將您的模式應用於緩衝數據時,它會嘗試查找輸入結束的第一個匹配項。由於1024個字符在緩衝區中,因此匹配引擎將調用位置1024作爲分隔符的第一個匹配項,並將其作爲第一個標記符返回之前的所有內容。
因爲這個原因,我不認爲在掃描器中使用輸入結束錨點是有效的。畢竟,它可能是從無限的流中讀取的。
嗨馬克,我認爲這是掃描儀不工作的正確原因。我正在投票答覆。使它正常工作的方法是標明正確的方法。謝謝您的回答。 – Sharmila 2010-10-04 17:55:05
Scanner
旨在從文件中讀取多個基元。它確實無意讀取整個文件。
如果你不希望包括第三方庫,你最好不要循環在BufferedReader
換行的文本FileReader
/InputStreamReader
,或循環在FileInputStream
二進制數據。
如果使用第三方庫就好了,阿帕奇commons-io有FileUtils
類,包含靜態方法readFileToString
和readLines
文字和readFileToByteArray
二進制數據..
您可以使用掃描儀類,打開掃描儀時,只需指定一個字符集,即:
Scanner sc = new Scanner(file, "ISO-8859-1");
的Java轉換從文件中讀取字節到使用指定的字符集,這是默認的(從底層OS)如果沒有被賦予字符(source )。目前還不清楚爲什麼Scanner只用默認的一個讀取1024個字節,而另一個則到達文件的末尾。無論如何,它工作正常!
永遠不要使用掃描儀!真的,你會遇到很多麻煩。 – 2010-10-04 18:17:42
@Martijn Courteaux - 謹慎提供掃描儀爲什麼不好的細節。 – whaley 2010-10-06 13:52:31