為什么用writeInt方法寫入的數(shù)據(jù)讀不出來 而writeChar的可以
import?java.io.File; import?java.io.IOException; import?java.io.RandomAccessFile; public?class?RandomAccessFileDemo?{ public?static?void?main(String[]?args)throws?IOException?{ //?TODO?Auto-generated?method?stub File?file=new?File("imooc"); if(!file.exists()){ file.mkdir(); } File?f=new?File("imooc\\a.txt"); if(!f.exists()){ f.createNewFile(); } RandomAccessFile?raf=new?RandomAccessFile(f,"rw");//創(chuàng)建一個隨機訪問文件對象 System.out.println(raf.getFilePointer());//返回指針的位置 String?str="中國"; byte[]?ba=str.getBytes(); raf.write(ba); String?str2="我愛慕課網(wǎng)123abc"; byte[]?ba3=str2.getBytes(); raf.write(ba3); System.out.println(raf.getFilePointer()); int?i=10; raf.writeInt(i); raf.writeChar('A'); raf.seek(0); byte?[]?ba2=new?byte[(int)raf.length()]; raf.read(ba2); String?ns=new?String(ba2); System.out.println(ns); } }
我用writeInt寫入的輸入10在文件中顯示是空格,而打印出的char字符A直接顯示在第二行,并且開頭有個空格,還有問下我看api里面writeBytes和writeChars都寫的是“?按字節(jié)序列將該字符串寫入該文件?!闭垎栍惺裁磪^(qū)別呢 ?還有這兩種寫入的方法要分別注明讀出來呢
2016-03-17
因為10在ascii碼中就是lf換行,所以會另起一行。如果你寫32進去那么就是一個空格了。
writeBytes(String s),是將字符串以一個字節(jié)一個字節(jié)寫入輸出流,如果字符是大于8位的,那么高8位就會被舍棄。
而writeChars(String s)是將字符串按照字符(在java中char是雙字節(jié))寫入輸出流。你去看writeBytes的源碼就知道,它其實是先把字符串寫入到一個char的數(shù)組,然后再把char數(shù)組寫到字節(jié)數(shù)組中。
writeBytes在寫入中文字符會舍棄高8位,所以寫入的文件就是缺失的,無法讀出原輸入。
writeChars如果程序本身使用雙字節(jié)編碼(如utf-16be,gbk),那么轉(zhuǎn)換下就可以讀出來。
2016-03-16
結(jié)果沒問題,關(guān)鍵是理解
writeBytes(String s) :將字符串按[字節(jié)]順序?qū)懭牖A(chǔ)輸出流。在Java中字節(jié)是8位的
writeChars(String s) :將字符串按[字符]順序?qū)懭牖A(chǔ)輸出流。在Java中字符是16位的