package com.io.d_chinese;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import org.junit.Test;
/*
* 字节流对中文数据的读写
*/
public class Demo1 {
// 将中文数据写出到文件中
@Test
public void testWrite() throws IOException{
// 找到目标文件
File file = new File("D:\\a.txt");
// 建立数据的输出通道
FileOutputStream out = new FileOutputStream(file);
String content = "大家好";
/*
将中文数据转换成字节数组:
getBytes():使用平台默认字符集(GBK码表)将此String编码为byte序列,并将结果存储到一个新的byte数组中;
字节流本身不能写中文,之所以能把中文数据写入文件中,是因为借助了字符串的getBytes()方法对中文进行了编码;
*/
byte[] b = content.getBytes();
// 将下面输出显示的6个字节的编码内容写入文件中,为什么打开文件看到的是中文?
// 因为记事本已经根据平台默认字符集(即根据GBK码表)对编码内容进行了解码;
System.out.println("编码内容:" + Arrays.toString(b));//编码内容:[-76, -13, -68, -46, -70, -61]
// 将数据写出
out.write(b);
// 关闭资源
out.close();
}
// 使用字节流读取文件中的中文数据
@Test
public void testRead() throws IOException{
// 找到目标文件
File file = new File("D:\\a.txt");
// 建立数据的输入通道
FileInputStream in = new FileInputStream(file);
// 读取内容
int content = 0;
/*
读取中文数据输出乱码的原因:
从上面将中文数据进行编码结果可以看出,将三个中文数据编码之后的内容为六个字节数据,即GBK码表中一个中文占两个字节;
而此处read()方法每次只能读取一个字节的数据,所以每读到一个字节数据就进行解码,是不可能解码成中文的;
*/
// while ((content = in.read()) != -1){
// System.out.print((char)content);
// }
// 使用字节流读取中文
byte[] buf = new byte[2]; // 声明一个缓冲数组,长度为2个字节
for (int i = 0; i < 3; i++){ // 由于有3个汉字,所以循环读取3次
in.read(buf); // 每次读取2个字节,存于缓冲数组中
System.out.print(new String(buf)); // 对读取到的2个字节进行解码
}
// 上面的方法虽然能够读取中文数据,但也只是能读取中文数据,如果中文数据中穿插英文数据,比如:大big家home好good;
// 由于每次读取两个字节之后再进行解码,而英文字母只占据一个字节,所以还是会出现乱码;
// 解决办法:使用 字符流 读取;
// 关闭资源
in.close();
}
}
Java学习笔记之IO(六):字节流对中文数据的读写
最新推荐文章于 2023-07-15 20:06:21 发布