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