為什么用writeInt方法寫(xiě)入的數(shù)據(jù)讀不出來(lái) 而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)建一個(gè)隨機(jī)訪問(wèn)文件對(duì)象
System.out.println(raf.getFilePointer());//返回指針的位置
String?str="中國(guó)";
byte[]?ba=str.getBytes();
raf.write(ba);
String?str2="我愛(ài)慕課網(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寫(xiě)入的輸入10在文件中顯示是空格,而打印出的char字符A直接顯示在第二行,并且開(kāi)頭有個(gè)空格,還有問(wèn)下我看api里面writeBytes和writeChars都寫(xiě)的是“?按字節(jié)序列將該字符串寫(xiě)入該文件。”請(qǐng)問(wèn)有什么區(qū)別呢 ?還有這兩種寫(xiě)入的方法要分別注明讀出來(lái)呢
2016-03-17
因?yàn)?0在ascii碼中就是lf換行,所以會(huì)另起一行。如果你寫(xiě)32進(jìn)去那么就是一個(gè)空格了。
writeBytes(String s),是將字符串以一個(gè)字節(jié)一個(gè)字節(jié)寫(xiě)入輸出流,如果字符是大于8位的,那么高8位就會(huì)被舍棄。
而writeChars(String s)是將字符串按照字符(在java中char是雙字節(jié))寫(xiě)入輸出流。你去看writeBytes的源碼就知道,它其實(shí)是先把字符串寫(xiě)入到一個(gè)char的數(shù)組,然后再把char數(shù)組寫(xiě)到字節(jié)數(shù)組中。
writeBytes在寫(xiě)入中文字符會(huì)舍棄高8位,所以寫(xiě)入的文件就是缺失的,無(wú)法讀出原輸入。
writeChars如果程序本身使用雙字節(jié)編碼(如utf-16be,gbk),那么轉(zhuǎn)換下就可以讀出來(lái)。
????????raf.seek(0); ????????for(int?t=0;t<raf.length()/2;t++){ ????????int?ch1?=?raf.read(); ????????int?ch2?=?raf.read(); ????????System.out.print(?(char)((ch1?<<?8)?+?(ch2?<<?0)));}2016-03-16
結(jié)果沒(méi)問(wèn)題,關(guān)鍵是理解
writeBytes(String s) :將字符串按[字節(jié)]順序?qū)懭牖A(chǔ)輸出流。在Java中字節(jié)是8位的
writeChars(String s) :將字符串按[字符]順序?qū)懭牖A(chǔ)輸出流。在Java中字符是16位的