String.getBytes()会按系统默认编码获取字符串的字节码,
而RandomAccessFile.write(byte b[]):写入字节数组(按字节数组的编码)
RandomAccessFile 读写文件时,不管文件中保存的数据编码格式是什么 使用 readLine()都读取到的都的是ISO-8859-1 编码的字符串,所以输出显示的时候要显示正常的话,必须把读取到ISO-8859-1 编码的字符串,转换成默认编码(或者指定编码)的字符串才能正常打印。
import java.io.IOException;
import java.io.RandomAccessFile;
public class Encoding2
{
public static void main(String[] args) throws IOException
{
RandomAccessFile ra = new RandomAccessFile("test.txt", "rw");
ra.setLength(0);//清空文件内容
ra.seek(0);
//String.getBytes():按系统默认编码(gbk)获取字符串的字节数组
//RandomAccessFile.write(byte[] bytes):写入字节数组。
//这样两个都是按照默认的编码写入的,
ra.write("abcd中国小明".getBytes());
ra.seek(0);
/**
* 不管文件中保存的数据编码格式是什么
* 使用 RandomAccessFile对象方法的 readLine() 都会将编码格式转换成 ISO-8859-1
* 所以要把"ISO-8859-1"编码的字节数组再次转换成系统默认的编码才可以显示正常
*/
String line=ra.readLine();
System.out.println(line);//readLine()读入的是ISO-8859-1编码的字符串,会乱码
//先按照先把ISO-8859-1编码的字符串解析成ISO-8859-1编码的字节数组,然后再按默认编码再生成字符串
System.out.println(new String(line.getBytes("ISO-8859-1")));
// System.out.println(
// new String(line.getBytes("ISO-8859-1"),"gbk"));
//需要重新转码才能正常显示
ra.close();
}
}
运行结果:
abcd???ú???÷
abcd中国小明
当前eclipse工程下面的编码时gbk,打开工程目录下面的test.txt文件:可以看到test.txt文件中没有乱码
如果要按照其他编码(如 utf-8)写入文件的时候,转换字符串时候要指定编码(utf-8)即可。
也就是上面的
System.out.println(new String(line.getBytes("ISO-8859-1")));
改成
System.out.println(new String(line.getBytes("ISO-8859-1"),”utf-8”));
即可代码:
import java.io.IOException;
import java.io.RandomAccessFile;
public class Encoding2
{
public static void main(String[] args) throws IOException
{
RandomAccessFile ra = new RandomAccessFile("test.txt", "rw");
ra.setLength(0);//清空文件内容
ra.seek(0);
//String.getBytes():按系统默认编码(gbk)获取字符串的字节数组
//RandomAccessFile.write(byte[] bytes):按字节数组的编码写入字节数组。
ra.write("abcd中国小明".getBytes("utf-8"));
ra.seek(0);
/**
* 不管文件中保存的数据编码格式是什么
* 使用 RandomAccessFile对象方法的 readLine() 都会将编码格式转换成 ISO-8859-1
* 所以要把"ISO-8859-1"编码的字节数组再次转换成系统默认的编码才可以显示正常
*/
String line=ra.readLine();
System.out.println(line);//readLine()读入的是ISO-8859-1编码的字符串,会乱码
//先按照先把ISO-8859-1编码的字符串解析成ISO-8859-1编码的字节数组,然后再按默认编码再生成字符串
// System.out.println(new String(line.getBytes("ISO-8859-1")));
System.out.println(
new String(line.getBytes("ISO-8859-1"),"utf-8"));
//需要重新转码才能正常显示
ra.close();
}
}
同时在eclipse中把test.txt的编码改成utf-8即可正常的显示
参考: