簡體   English   中英

使用Java掃描程序讀取文件

[英]Reading a file using Java scanner

我試圖理解的java文件中的一行是如下所示。

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

根據java.util.regex.Pattern文檔,該文件應返回到“輸入的結尾,但對於最終的終結符,如果有的話”。 但是,它只返回文件中的前1024個字符。 這是正則表達式模式匹配器施加的限制嗎? 這可以克服嗎? 目前我正在使用文件閱讀器。 但我想知道這種行為的原因。

我自己,我無法重現這一點。 但我想我能說明發生了什么。

在內部,掃描儀使用1024個字符的字符緩沖區。 默認情況下,掃描儀將從可讀的1024個字符中讀取,如果可能,然后應用該模式。

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

由於這個原因,我認為輸入結束錨不適用於掃描儀。 畢竟,它可能是從無限的流中讀取的。

嘗試將file對象包裝在FileInputStream

Scanner旨在從文件中讀取多個基元。 它實際上並不打算讀取整個文件。

如果您不想包含第三方庫,最好循環一個BufferedReader ,它包裝文件的FileReader / InputStreamReader ,或者循環遍歷FileInputStream以獲取二進制數據。

如果你可以使用第三方庫,那么Apache commons-io有一個FileUtils類,它包含靜態方法readFileToStringreadLines for text和readFileToByteArray for binary data ..

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

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

Java使用指定的字符集將從文件讀取的字節轉換為字符,如果沒有給出( ),則這是默認的字符集(來自底層操作系統)。 我仍然不清楚為什么Scanner只使用默認值讀取1024個字節,而另一個則到達文件末尾。 無論如何,它工作正常!

暫無
暫無

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

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