RandomAccessFile的編碼轉換問題

package june;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
 * File
 * |................***............***.......|
 * |................|..............|.........|
 * 0XL              1XL            2XL       3XL
 */
public class Demo9 {
static File file=new File("aaa.txt");
class WriteFile extends Thread{
File file;
int block;
int L=18;
public WriteFile(File file,int b){
this.file=file;
this.block=b;
}
public void run(){
RandomAccessFile rdm;
try {
rdm=new RandomAccessFile(file,"rw");
rdm.seek((this.block-1)*L);
//writeBytes(String s)捨棄高八位,所以要轉換成ISO8859_1。
//它是單字節編碼,漢字不能用它來表示(裝不下),但由於是單字節編碼,和計算機最基礎的表示單位一致,所以仍舊常用,表示漢字的時候只能進行拆分,然後用gbk讀取
//可以將一個漢字表示成分開的兩個字節  格式是:“中文” d6 d0 ce c4  
//GBK一個漢字佔兩個字節格式是 d6d0 cec4  
//UTF8一個漢字佔3個字節格式是 e4 b8 ad e6 96 87
//用ISO8859_1解碼由字符串所轉化而成的byte[]數組,最後轉換爲unicode(定長雙字節)存儲,把單字節編碼轉換成雙子節編碼並保存,會產生亂碼。
String str=new String("我是中國".getBytes("GBK"),"ISO8859_1");
System.out.println(str);  //輸出一堆亂碼
rdm.writeBytes(str);  //去文件裏查看,結果正確
String str2="asdf";
rdm.writeBytes(str2);
//如果是普通的write(byte[] b)方法,只要編解碼操作用同一種編碼就可以了
// String str=new String("我是中國".getBytes("UTF8"),"UTF8");
// rdm.write(str.getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
if(file.exists()){
file.delete();
Demo9 mut=new Demo9();
mut.new WriteFile(file,1).start();
mut.new WriteFile(file,2).start();
mut.new WriteFile(file,3).start();
mut.new WriteFile(file,4).start();
mut.new WriteFile(file,5).start();
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章