Java RandomAccessFile類


 

RandomAccessFile類是Java中操作文件內容功能最強大的類,既可以讀,也可以寫。

RandomAccessFile支持隨機訪問,可以直接訪問文件的任意位置,在文件的任意位置讀寫數據。如果要隨機訪問文件內容,RandomAccessFile是很好的選擇。

Random,意為隨機、任意,RandomAccessFile,即可訪問文件的任意位置;RAM(Random Access  Memory),即可訪問文件/數據任意位置的內存。

 

 

構造函數:

  • RandomAccessFile(String filePath, String mode)
  • RandomAccessFile(File  file, String mode)

mode是一個字符串,指定文件打開方式。可能的值:

  • “r”    只讀,若文件不存在,會報錯
  • “rw”    讀寫,若文件不存在,會自動創建。只要有write權限,文件不存在時都會自動創建。
  • “rwd”   讀寫,對文件內容的每個更新都會同步寫到底層IO設備
  • “rws”    讀寫,對文件內容、元數據的每個更新,都會同步寫入底層IO設備。

 

 

RandomAccessFile提供了多種讀寫數據的方法,能讀寫多種類型的數據,既能以字符方式進行讀寫,又能以字節方式進行讀寫。

 

 

RandomAccessFile提供了2個操作記錄指針的方法,用於支持隨機讀寫:

  • long  getFilePointer()    返回文件記錄指針的當前位置
  • void  seek(long  position)    將文件指針跳轉到指定位置

InputStream類、Reader類也提供了操作指針的方法,但操作的指針都是讀指針,只能在輸入流中使用。OutputStream類、Writer類不能操作指針。可以隨機讀,不能隨機寫。

RandomAccessFile操作的指針是讀寫指針,可以在讀的時候操作指針,也可以在寫的時候操作指針,可以隨機讀寫。

 

 

說明:

  • RandomAccessFile只能操作文件內容(讀寫),不能對文件本身進行操作(修改文件名、刪除等),也不能訪問文件的其他信息,比如最后修改時間,但可以訪問文件大小(內容長度)。
  • RandomAccessFile,這里的File只指文件,不包括文件夾,即只能操作文件。
  • RandomAccessFile不能在指定位置插入內容,指針跳轉到指定位置,寫入內容,會覆蓋原有的內容,並不是插入。要實現插入,需要借助一個中間容器,可以將后面的內容讀到一個大的byte[]中,或者新建一個臨時文件來保存,指針跳轉到指定位置開始寫,然后再把byte[]或者臨時文件中的內容寫入。

 

 

 

使用RandomAccessFile實現多線程斷點傳輸、下載(比如迅雷):

 

1、開始時建立2個文件,通過File類的靜態方法createTempFile()創建一個同等大小的空的臨時文件,再創建一個文本文件用於記錄每個文件指針的位置

 

2、啟動多個線程,每個線程只負責一小節內容的下載。每個線程使用一個單獨的byte[]、網絡輸入流對象、RandomAccessFile對象(向臨時文件中寫入數據,要隨機寫)、文件指針(網絡輸入流對象、RandomAccessFile對象使用的文件指針位置是相同的),使用循環從網絡中讀取數據,存儲在byte[]中,將byte[]中的數據寫入到臨時文件中。

 

3、由於用戶點擊暫停、網絡中斷、退出程序等原因導致下載中斷時,要將每個線程的文件指針位置保存到文本文件中,繼續下載時先從文本文件中讀取每個線程的指針位置,將每個線程的文件指針位置設置為對應的值(網絡輸入流對象、RandomAccessFile對象都要設置),然后啟動多線程繼續下載。

 

4、完成后重命名臨時文件為源文件名。

 

較忙,以后再補源碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM