溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java怎么讀文件

發(fā)布時間:2022-01-06 16:59:33 來源:億速云 閱讀:99 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“java怎么讀文件”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

寫文件基本是單線程順序?qū)懙?,?FileOutputStream 就可以了。但是讀文件一般不是順序讀的,為了實現(xiàn)想讀哪里讀哪里的功能,通常需要 RandomAccessFile。

在我們讀文件之前,首先要知道數(shù)據(jù)起始位置(offset)和長度(length),這樣才能使用 RandomAccessFile 的 seek方法移動到數(shù)據(jù)起始位置,然后將數(shù)據(jù)讀出來。

基本過程就是這樣的,很簡單:

java怎么讀文件

上面這段代碼看起來挺完整的,但是,缺少了一個重要環(huán)節(jié),驗證。當(dāng)你交給一個人做一件事之后,要驗證他是否完成,以及完成的怎么樣。這里也一樣。

RandomAccessFile 的 read(byte b[]) 方法的定義是這樣的(去掉了不重要的doc):讀取 b.length 個字節(jié),放到 b 中,并返回一共讀取了多少個字節(jié);當(dāng)?shù)竭_(dá)文件末尾,沒有數(shù)據(jù)可讀時,返回 -1。

java怎么讀文件

在程序中每一個細(xì)節(jié)都是需要注意的。那么,這里為什么要有返回值?

讀多少數(shù)據(jù)是我告訴這個方法的,它又返回給我,這不是有病嗎?不是。因為能讀出來多少數(shù)據(jù)是不確定的,即這個方法不能保證一次調(diào)用肯定能讀出來 b.length 個字節(jié)的數(shù)據(jù)。其中一個原因是:文件沒有這么多字節(jié)可讀。

不確定還有沒有其他原因,我在一個4G的文件中單線程隨機讀取1G以內(nèi)的數(shù)據(jù)4萬次,返回的值都和要求讀取的值一樣,但是一個 up to 應(yīng)該不能為這個方法打包票,即還有其他原因會導(dǎo)致方法無法讀取到需要的數(shù)據(jù)。這里是猜測,暫且命名 喬老師猜想

我為什么要提這個 up to 呢,因為 InputStream 的 read(byte b[]) 的說明更過分:

java怎么讀文件

第一句說  Reads some number of bytes from the input stream java怎么讀文件 這是什么doc,搞笑呢?但是這就是這個方法的本來面目。它確實無法保證能讀到你想要的完整數(shù)據(jù)。

但是,有一點是可以確定的,那就是  the total number of bytes read into the buffer 。你可以檢查是否讀到了完整的數(shù)據(jù)。

而實際系統(tǒng)中:你必須檢查是否讀到了完整的數(shù)據(jù)。否則你的系統(tǒng)可能崩掉,而你還不知道問題出在哪。

那么,有沒有補救措施呢,是有的,RandomAccessFile 方法提供了另一個方法:這個方法在讀到 b.length 個字節(jié)之前不會給你返回的,除非遇到文件末尾或者遇到異常。這個方法就比較靠譜了。

java怎么讀文件

而這個方法的實現(xiàn)是將原來的讀方法套了個循環(huán):一次沒讀完,我就接著讀!直到讀到 0 個字節(jié),也就是讀到文件末尾了。

java怎么讀文件

這個方法的實現(xiàn)可以驗證 喬老師猜想,(如果普通的 read 方法可以保證除了遇到文件末尾,都能返回需要的數(shù)據(jù),就不需要循環(huán)讀取了,只需要讀一次判斷 count 是否為 0 拋出異常就好了。因此,普通的 read 方法肯定還有其他原因會導(dǎo)致無法讀取需要的數(shù)據(jù))。

在使用了 readFully() 方法后,我們只需要處理 EOFException(End of File Exception,讀到文件末尾了還沒讀到要求的數(shù)據(jù)長度) 一種異常就好了。

因此,完整的讀流程為:使用 RandomAccessFile 的 readFully + 檢查

java怎么讀文件

“java怎么讀文件”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI