java/android 字节流和字符流的介绍

2025-07-18 00:54:46

如果你不太了解编码格式的话,请看我写的宛鳘艺荤另一篇经验:各种编码格式介绍;如果你不太了解File类的话,请看我写的另一篇经验:android Fil髫潋啜缅e类的使用;以及稍微复杂一点的用法。另,本篇经验只介绍字节流和字符流中常用的几个方法,其他的请自行百度学习,而且我也不会。最后,这篇经验很长,也是我自己实际写代码验证的,如果不对,麻烦指出,我会修改的。图片是引用的别人的的一个图,名字叫《Java IO基础总结》

java/android 字节流和字符流的介绍

6、InputStream有许多子类,比如FileInputStream,实现了具体在文件中读取数据的各种方法。同理,OutputStream还有一个子类FileInputStream,实现了向文件中写入数据的各种方法。当然,还有很多其他的子类。

7、这里的重点是,字节流涠础险渥操纵的是字节,不是字符。举个例子:使用字节流,我们从一个文件中读取数据,然后写入到另一个文件的过程。首先,这个文件中存放的是字符,并且是喋笊脎脶某一个种编码格式,比如UTF-8格式。那么,这个文件中的字符在电脑中存放的二进制文件就是以UTF-8格式存放的,所以字节流读取的数据就是这些以UTF-8格式存放的二进制;然后,字节流再将这些二进制文件写入到另一个文本中,写入的就是以UTF-8格式存放的二进制文件,然后文本文档自己判断这些二进制文件是UTF-8格式,就会用这种格式将字节转变为字符,我们人就可以看得懂了。

8、看了例子:我们创建一个文本,写入一个字“你”,然后保存为UTF-8格式。

java/android 字节流和字符流的介绍

10、运行下程序,看下结果,总共6个字节,前面3个字节不管,只的是本文档是UTF-8格式,后面3个字节是“你”,在UTF-8,一个中文一般占3个字节。这也就验证了之前说的,文本中存放的是字符,这个字符在电脑中存放的二进制文件就是UTF-8格式,然后我们的字节流读取的就是3个字节。

java/android 字节流和字符流的介绍

12、再运行下上述代码,发现是2个字节,因为GBK格式的汉字,一个就占2个字节。

java/android 字节流和字符流的介绍

14、然后我们看一下D:/alsp/world.txt中的内容,发现有了一个字符A了。

java/android 字节流和字符流的介绍

17、下面,我们再将之前读取的文件内容,再写入到另一个文件中。但是,我们做一点小改变。首先,将hello.txt文件的编码格式改为:utf-8,将内容改为“你好呀”

java/android 字节流和字符流的介绍

19、运行如下程序,File file1 = new File("D:/alsp/hello.txt"); File file = new File("D:/a造婷用痃lsp/world.txt"); FileInputStream fileInputStream = new FileInputStream(file1); FileOutputStream out = new FileOutputStream(file); int b; int i = 1; while((b = fileInputStream.read()) != -1){ System.out.print(Integer.toHexString(b) + " "); out.write(b); }

java/android 字节流和字符流的介绍

21、这也就证明我们之前所说的,将二进制格式写入到文件中,文本文档会自己识别出这些二进制到底是什么格式的,然后以这种格式将二进制变成我们认识的字符。而我们日常生活中有时候遇到的乱码,就是格式不对。比如,以UTF-8格式写的字符,偏偏要以ANSI格式打开,那肯定是乱码的。

二.字符流

1、从前面字节流的学习,相信你已经清楚了,字符流是和编码息息相关的。

2、字符流也有2个抽象类,一个是reader,一个是writer.字符处理就是一次处理一个字符,但是字符是由字节组成的。

3、那么问题来了,字符的编码格式各种各样,有ANSI,有UTF-8,UTF-16等等,有的一个字符占1个字节,有的一个字符占2个字节,还有占3个字节、4个字节等等,那么该如何解析呢?

4、reader有一个子类InputStreamReader,用于将字节流解析为字符流,按照编码解析;writer有一个子类OutputStreamReader,用于将字符流解析为字节流,按照编码处理;

5、看如下代码,从一个本文中读取相应的数据(该文本是ANSI编码格式)FileInputStream in = new FileInputStream("D:/alsp/hello.txt"); InputStreamReader isr = new InputStreamReader(in); int a; while ((a = isr.read())!=-1){ System.out.print((char)a); }

6、看读取结果,将你好呀,正确读取了

java/android 字节流和字符流的介绍

8、现在,我们将刚才的文本文档改为UTF-8编码格式,发现读取的就是乱码了,因为我们的工程师按照GBK解析的

java/android 字节流和字符流的介绍java/android 字节流和字符流的介绍

10、当然,也可以通过如下方式,直接写明编码方式InputStreamReader isr = new InputStreamReader(in,"gbk");

11、InputStreamReader有一个子类,FileReader;OutputStreamReader有一个子类,FileWriter;

12、这两个方法使用起来就很简单了。FileReader fr = new FileReader("D:/alsp/hello.txt"); FileWriter fw = new FileWriter("D:/alsp/world.txt");看,不需要上面繁琐的过程,直接就可以这样操作文件。但是,这两个方法无法指定编码格式,如果需要指定编码格式,仍然需要上述这种比较繁琐的使用方式。

13、reader和writer还有其他的一些子类,比如BufferedReader,BufferedWriter等,就不一一详述了。不过这里简单的说下BufferedReader和BufferedWriter。

14、BufferedReader方法需要传宕蜉窑煜递一个reader类型的参数,我们可以这样使用:FileInputStream fileInputStream = new FileInputStream(files);BufferedReader reader = new BufferedReader( new InputStreamReader(fileInputStream));我们首先通过FileInputStream创建一个字节流的引用,然后再通过InputStreamReader将字节流转变为字符流,再把这个作为参数传入BufferedReader 的构造方法中。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢