RandomAccessFile的编码转换问题

来源:互联网 发布:淘宝平板版下载 编辑:程序博客网 时间:2024/06/08 04:11
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();
}
}
}