java 字节流设置编码方式_Java基础进阶 转换流、编码、解码、乱码

1、转换流(掌握)

我们学习字符流的时候知道字符流:它的底层是字节流和编码表。

需求:在硬盘上新建一个文本文件D:\out.txt,输入”你好”两个汉字,并以UTF-8编码保存,使用程序读取文件中的数据并打印到控制台上。

代码如下:

分析和步骤:

1)创建输入流FileReader类的对象fr,D:\out.txt作为参数;

2)定义字符数组,数组名是ch,长度是1024;

3)定义一个变量len=0记录着读取的字符个数;

4)使用循环来控制次数并输出读取到的数据;

5)关闭资源;

/*

* 转换流的演示

*/

public class ExchangeDemo {

public static void main(String[] args) throws IOException {

//创建字符输入流的对象

FileReader fr = new FileReader("D:\\out.txt");

//定义数组

char[] ch=new char[1024];

int len=0;

while((len=fr.read(ch))!=-1)

{

System.out.println(new String(ch,0,len));

}

//关闭资源

fr.close();

}

}

结果如下:

051aae9d07a4?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

1.png

问题分析:

硬盘上有个记事本文件中保存的数据是以UTF-8编码保存的,现在我们使用的FileReader在读取这个记事本中的数据,结果记事本中保存的“你好”,但使用程序读取到的“浣犲ソ”,数据读取错误了。

错误原因:

出现上述的错误数据的原因是记事本文件中保存的数据使用的编码表和我们程序中读取数据使用的编码表不一致。导致数据错误了。

而我们知道字符流在读取数据的时候,是先从底层读取字节数据,然后再结合编码表查到对应的字符数据。现在我们希望读取到正确的数据,必须使用和保存时一致编码表。不能再使用FileReader进行读取,因为FileReader读取数据底层使用的是默认的编码表GBK来读取数据的,而这里我们需要在读取数据的时候指定编码表。

那么既然不能使用FileReader来根据默认编码表进行读取数据,那么怎样通过指定的编码表来进行读取数据呢?

Java提供了一个转换流InputStreamReader可以在读取数据的时候指定编码表,然后把字节数据根据指定编码表转成字符数据。

1.1、转换流介绍

转换流:它的主要功能就是进行字节数据和字符数据之间的转换的。转换流它就是用来转换的,它不能和底层的文件进行关联,也就是说转换流不能去读写文件中的数据。读取底层的字符数据还是得需要我们之前讲过的字符流FileReader。向硬盘中的文件中写数据得需要我们之前讲过的FileWriter类。

Java中提供了2个转换流对象:

InputStreamReader:输入流(硬盘文件数据------》内存),它的功能是把读取到的字节(硬盘上的数据都是字节数据)转换转成字符数据。字节转字符输入转换流。

OutputStreamWriter:输出流(内存---->硬盘文件),它的功能是把字符数据转成字节数据并写到硬盘上指定的文件中。字符转字节输出转换流。

转换流的执行原理如下图所示:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值