您好,登錄后才能下訂單哦!
本篇內容介紹了“java怎么讀文件”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
寫文件基本是單線程順序寫的,用 FileOutputStream 就可以了。但是讀文件一般不是順序讀的,為了實現想讀哪里讀哪里的功能,通常需要 RandomAccessFile。
在我們讀文件之前,首先要知道數據起始位置(offset)和長度(length),這樣才能使用 RandomAccessFile 的 seek方法移動到數據起始位置,然后將數據讀出來。
基本過程就是這樣的,很簡單:
上面這段代碼看起來挺完整的,但是,缺少了一個重要環節,驗證。當你交給一個人做一件事之后,要驗證他是否完成,以及完成的怎么樣。這里也一樣。
RandomAccessFile 的 read(byte b[]) 方法的定義是這樣的(去掉了不重要的doc):讀取 b.length 個字節,放到 b 中,并返回一共讀取了多少個字節;當到達文件末尾,沒有數據可讀時,返回 -1。
在程序中每一個細節都是需要注意的。那么,這里為什么要有返回值?
讀多少數據是我告訴這個方法的,它又返回給我,這不是有病嗎?不是。因為能讀出來多少數據是不確定的,即這個方法不能保證一次調用肯定能讀出來 b.length 個字節的數據。其中一個原因是:文件沒有這么多字節可讀。
不確定還有沒有其他原因,我在一個4G的文件中單線程隨機讀取1G以內的數據4萬次,返回的值都和要求讀取的值一樣,但是一個 up to 應該不能為這個方法打包票,即還有其他原因會導致方法無法讀取到需要的數據。這里是猜測,暫且命名 喬老師猜想。
我為什么要提這個 up to 呢,因為 InputStream 的 read(byte b[]) 的說明更過分:
第一句說 Reads some number of bytes from the input stream 這是什么doc,搞笑呢?但是這就是這個方法的本來面目。它確實無法保證能讀到你想要的完整數據。
但是,有一點是可以確定的,那就是 the total number of bytes read into the buffer 。你可以檢查是否讀到了完整的數據。
而實際系統中:你必須檢查是否讀到了完整的數據。否則你的系統可能崩掉,而你還不知道問題出在哪。
那么,有沒有補救措施呢,是有的,RandomAccessFile 方法提供了另一個方法:這個方法在讀到 b.length 個字節之前不會給你返回的,除非遇到文件末尾或者遇到異常。這個方法就比較靠譜了。
而這個方法的實現是將原來的讀方法套了個循環:一次沒讀完,我就接著讀!直到讀到 0 個字節,也就是讀到文件末尾了。
這個方法的實現可以驗證 喬老師猜想,(如果普通的 read 方法可以保證除了遇到文件末尾,都能返回需要的數據,就不需要循環讀取了,只需要讀一次判斷 count 是否為 0 拋出異常就好了。因此,普通的 read 方法肯定還有其他原因會導致無法讀取需要的數據)。
在使用了 readFully() 方法后,我們只需要處理 EOFException(End of File Exception,讀到文件末尾了還沒讀到要求的數據長度) 一種異常就好了。
因此,完整的讀流程為:使用 RandomAccessFile 的 readFully + 檢查
“java怎么讀文件”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。