Java学习笔记之IO(六):字节流对中文数据的读写

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();
	}
	
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值