JAVA字节流读取文本及出现乱码原因

一.字节流
单个字节读取

public static void main(String[] args) {		
		try {
			FileInputStream in = new FileInputStream("D:\\bf\\Desktop\\test.txt");//字节流
			int data = in.read();
			while(data != -1){
				System.out.print((char)data);
				data = in.read();
			}
			in.close();
		} catch (FileNotFoundException e) {			
			e.printStackTrace();
		} catch (IOException e) {			
			e.printStackTrace();
		}
	}

在这里插入图片描述
结果分析:可以看出结果出现了乱码,这是因为UTF-8文件下一个中文是两个字节,三个字节或四个字节。。。,单字节读取出现了乱码。

多个字节读取

try {
			byte [] b = new byte[1024];
			//System.out.print("?".getBytes("UTF-8").length);//输出4,即4个字节
			FileInputStream in = new FileInputStream("D:\\bf\\Desktop\\test.txt");//字节流
			//BufferedInputStream bu = new BufferedInputStream(in);//BufferedInputStream是一种封装别的流以提高效率的流,它的初始化需要一个的InputStream流对象
			int n = in.read(b);
			//int n = bu.read(b);
			while(n != -1){
				System.out.print(new String(b, 0, n));//确保输出的是每次读取的,避免上次读取的数组
	对结果的影响		
	        	n = in.read(b);
				//n = bu.read(b);
			}			
			in.close();
			//bu.close();			
		} catch (FileNotFoundException e) {			
			e.printStackTrace();
		} catch (IOException e) {			
			e.printStackTrace();
		}		
	}

在这里插入图片描述
结果分析:可以看出短文本能够正在显示,这是因为一次性读取完全,没有读取一个中文部分字节的情况,保持了文本的完整性。
注意:UTF-8下中文的字节长度有可能是2、3或4…若读取一个数组长度字节,很难确定长度范围,所以读取文本应尽量避免使用字节流,应使用字符流。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值