今天跟大家分享一下javase中的關於I/O的操作:
有時我們需要在檔案的末尾追加一些內容,在這時用RandomAccessFile就很好。
這個類有兩個構造方法:
RandomAccessFile(File file,
String mode) 建立從中讀取和向其中寫入(可選)的隨機訪問檔案流,該檔案由
File 參數指定。 |
RandomAccessFile(String name,
String mode) 建立從中讀取和向其中寫入(可選)的隨機訪問檔案流,該檔案具有指定名稱。 |
其中mode 參數指定用以開啟檔案的訪問模式。允許的值及其含意為:
"r" 以唯讀方式開啟。調用結果對象的任何 write 方法都將導致拋出 IOException。
"rw" 開啟以便讀取和寫入。如果該檔案尚不存在,則嘗試建立該檔案。
"rws" 開啟以便讀取和寫入,對於 "rw",還要求對檔案的內容或中繼資料的每個更新都同步寫入到底層存放裝置。
"rwd" 開啟以便讀取和寫入,對於 "rw",還要求對檔案內容的每個更新都同步寫入到底層存放裝置。
"rws" 和 "rwd" 模式的工作方式極其類似 FileChannel 類的 force(boolean) 方法,分別傳遞 true 和 false 參數,除非它們始終應用於每個 I/O 操作,並因此通常更為高效。如果該檔案位於本機存放區裝置上,那麼當返回此類的一個方法的調用時,可以保證由該調用對此檔案所做的所有更改均被寫入該裝置。這對確保在系統崩潰時不會丟失重要訊息特別有用。如果該檔案不在本地裝置上,則無法提供這樣的保證。
"rwd" 模式可用於減少執行的 I/O 運算元量。使用 "rwd" 僅要求更新要寫入儲存的檔案的內容;使用 "rws" 要求更新要寫入的檔案內容及其中繼資料,這通常要求至少一個以上的低層級 I/O 操作。
如果存在安全管理器,則使用 file 參數的路徑名作為其參數調用它的 checkRead 方法,以查看是否允許對該檔案進行讀取存取。如果該模式允許寫入,那麼還使用該路徑參數調用該安全管理器的 checkWrite 方法,以查看是否允許對該檔案進行寫入訪問。
如果要在檔案的結束點追加內容,那就用第一個構造方法,調用RandomAccessFile的seek(long lg)方法,該方法傳遞進去一個long型的資料,我們正好可以把file.length()傳遞進去,這樣就按照要求在檔案末尾追加內容。
但這裡可能會遇到了亂碼問題,如果用的RandomAccessFile的writeBytes(String s)方法寫入內容,就會出現亂碼,所以最好是用write(byte[] b)方法,例如:String s = "中文"; raf.write(s.getBytes());這樣就很好的解決了亂碼問題。關於這兩種方法,許多人認為好像差不多,其實是完全相反的方式,writeBytes(String s)方法將中文拆成兩個位元組寫進文本,所以會造成亂碼,write(byte[]
b)方法是將每兩個位元組合成一個中文並寫時文本,所以不會出現亂碼。
我們還可以調用writeUTF(String str)方法避免亂碼。
結下來還有一個解決換行的問題,寫了“/n”不管用啊。實際上要用“/r/n”才行。
“/r”即斷行符號,回到一行的開頭。“/n”即換行,另起一行。這大家都是知道的。
我們在程式裡寫檔案的時候所謂的“斷行符號符”確切的說應該是“斷行符號分行符號”。
在windows系統下,斷行符號分行符號號是“/r/n”,但是在Linux等系統下是沒有“/r”符號的,我們一般都是在window下,所以說在用程式寫檔案是應該是“/r/n”才對。
補充:為了適應跨平台需求,建議斷行符號換行用System.getProperty("line.separator")。