黑马程序员技术交流社区

标题: FileReader和FileInputStream的区别 [打印本页]

作者: noiary    时间: 2014-10-26 21:44
标题: FileReader和FileInputStream的区别
本帖最后由 noiary 于 2014-10-26 21:45 编辑

io学得也是懵懵懂懂,迷迷糊糊.
刚刚复习FileInputStream,莫名觉得它的read()方法和FileReader的read()看起来似乎一样啊.都是返回int,都是以-1为结尾标识.

那为什么一个叫字符流一个叫字节流?

百思不解下去百度,得出如下答案:
FileInputStream字节流是 以一个一个字节来读。
FileReader字符流是 以一个一个字符来读取的。

看完好像明白了什么..又好像没太明白..

所以字节写了个Demo:
  1. /*
  2. 测试
  3. FileInputStream和FileReader的read()方法
  4. 返回的int类型编码是否一致
  5. */

  6. import java.io.*;

  7. public class Demo {

  8.         public static void main(String[] args) throws IOException{
  9.                 FileInputStream fis = new FileInputStream("Demo.txt");
  10.                 FileReader fr = new FileReader("Demo.txt");
  11.                
  12.                 fisRun(fis);
  13.                 frRun(fr);
  14.                
  15.         }
  16.         
  17.         public static void fisRun(FileInputStream fis) throws IOException{
  18.                 int len = 0;
  19.                 System.out.println("fis:\t");
  20.                 while((len = fis.read()) != -1) {
  21.                         System.out.print((char)len);
  22.                 }
  23.                 System.out.println();
  24.         }
  25.         
  26.         public static void frRun(FileReader fr) throws IOException {
  27.                 int ch = 0;
  28.                 System.out.println("fr:\t");
  29.                 while((ch = fr.read()) != -1) {
  30.                         System.out.print((char)ch);
  31.                 }
  32.                 System.out.println();
  33.         }
  34. }
复制代码

运行结果出乎意料,居然也是一样的!

突然想到是不是Demo.txt编码问题,


我机器默认用的是GBK编码,所以读出来的都是一样的数字,


然后我改成了UTF-8,结果果然就不一样了!




作者: MeryStyle    时间: 2014-10-27 11:16
FileInputStreamReader 的 Read 方法一次读取到的是一个字节,仅仅一个;FileReader 的 read 方法一次读取到的是一个字符,char 类型的,默认是两个字节。
作者: neokevin    时间: 2014-10-27 11:35
正如楼上所说,字符流一般用来读取文本文件,而字节流可以读取包括文本文件的一切文件例如视频,音频文件,我们知道java的char类型占两个字节,汉字是占两个字节的,如果我们调用字符流的read方法,读取是没有问题的,但是如果我们用字节流读取的话那就有问题了哦。
作者: noiary    时间: 2014-10-27 12:56
neokevin 发表于 2014-10-27 11:35
正如楼上所说,字符流一般用来读取文本文件,而字节流可以读取包括文本文件的一切文件例如视频,音频文件, ...

觉得跟字符编码也有很大关系,如果被读取文本用GBK,两者读取都是一样的,但是用别的就出现区别了.
作者: noiary    时间: 2014-10-27 12:59
MeryStyle 发表于 2014-10-27 11:16
FileInputStreamReader 的 Read 方法一次读取到的是一个字节,仅仅一个;FileReader 的 read 方法一次读取 ...

所以GBK不管用FileReader还是FileInputStream读取出来的都是每次两个字节,结果才会一样对吧!
作者: MeryStyle    时间: 2014-10-27 14:59
noiary 发表于 2014-10-27 12:56
觉得跟字符编码也有很大关系,如果被读取文本用GBK,两者读取都是一样的,但是用别的就出现区别了. ...

那是因为,你写入的时候用的是默认编码表,而读取的时候用的UTF-8,肯定读取的结果是不一样的
作者: MeryStyle    时间: 2014-10-27 15:05
noiary 发表于 2014-10-27 12:59
所以GBK不管用FileReader还是FileInputStream读取出来的都是每次两个字节,结果才会一样对吧! ...

“-1”只是定义的一个文件结束标记,他不代表某一个字符值或者字节值;
数据读写,和字符编码无关,编码表只是读写数据时,用来查找的二进制值和字符的一种对应关系;
这个与编码表看似有关,其实没有一点关系,
作者: 坚持525    时间: 2014-10-27 19:39
建议你先看看过来人整理的文档吧,再去看视频吧,那样效率会好点。

Java知识点总结.rar

886.26 KB, 下载次数: 157






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2