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();
}
}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值