黑马程序员技术交流社区

标题: 纯文本必须用FileReader吗? [打印本页]

作者: 黄玉昆    时间: 2013-3-5 11:05
标题: 纯文本必须用FileReader吗?
本帖最后由 黄玉昆 于 2013-3-5 22:31 编辑

在学习Properties的load方法的时候,毕老师的代码中用的是FileInputStream创建的info.txt文件,这个文件不是纯文本吗?按理说应该是用FileReader的啊,是不是这里用哪个都行呢?
代码如下:
  1. //load方法
  2.         public static void loadMthod()throws IOException
  3.         {
  4.                 Properties pop =new Properties();
  5.                FileInputStream fis = new FileInputStream("info.txt");//这里必须用FileInputStream吗?
  6.                 //将流中的数据加载进集合
  7.                 pop.load(fis);
  8.                 pop.setProperty("ww","24");
  9.                 FileOutputStream fos = new FileOutputStream("info.txt");
  10.                 pop.store(fos,"hehe");
  11.                 pop.list(System.out);
  12.                 fis.close();
  13.                 fos.close();

  14.         }
复制代码

作者: 谢洋    时间: 2013-3-5 11:38
1、如果是文本,用字节流字符流都行。
2、先有字节流,后有字符流;字节流可以读取任意的二进制数文件,他操作时不进行编码;
而字符流存取经过字符编码的文件,也就是说他在存取是都是经过查编码表的(而码表是固定的二制进数据;
3、面上是通过字节流往txt文件是存进去的是字符数据(字符数据不是任意的二进制数)对应的二进制数,这时存入的二进制数据不可能是任意的
当我们在打开txt文件时,txt文件会把这些二进制数根据它默认的编码表来查得到相应的字符,然后再显示出来
  如果我们把任意的二制数据存入文本时,就会出现乱码
4、当我们用字符流去操作非文本文件是会发生什么问题?
   首先,非文本件的内的数据是任意的二进制数据,既然是任意的,那么字符流在查码表时,这些任意的二进制数,
  很有可以在码表找不到相对应的字符的编码,这就是乱码的由来发了
作者: 杨杨    时间: 2013-3-5 11:39
用FileReader 可能出现乱码 不好处理 ,他没有处理乱码的构造方法最好用FileInputStream
作者: Beautiful    时间: 2013-3-5 12:02
本帖最后由 戴俊毅 于 2013-3-5 12:04 编辑

1 首先 FileInputStream是字节流   而FileReader是字符流  另外这个属性键值对集合Properties的方法load(InputStream inStream) 往里面传的是字节流数据,所以 你特地转化为字符流还传不进去了所以这里要用字节流,而是不是一定要用FileInputStream呢 ,得出结论你这里可以用InputStream来接收也可以,比如在反射里面不是有通过  主函数类名.class.getClassLoader().getResourceAsStream(详细的文件路径及文件名称)来获得一InPutStream对象么,所以 还真不一定一定要用FileInputStream。
2 为什么纯文本文件能用字节流,首先我们得明确一下字符流的由来,字节流一般都是可以搞定,但是有一种数据是非常常见的,文本文件,这个时候就单独分离出一块字符流,根据编码表来查找文字,提高了效率。所以字符流里面是整合了编码表提高了读取的效率,而字节流里面没有编码表。所以你知道了我们一般情况文本文件为什么用字符流了吧,为了提高效率啊,另外字节流去读取文本文件也是可以胜任的。所以我们才会有字节流通向字符流的通道InputstreamReader,因为转化为字符流之后能提高效率,比如转化为字符流之后那个BufferedReader里面有个方法ReadLine方法一行一行读,处理器文本文件更加快。
个人愚见,希望对你有帮助,对错有待大家交流学习。
作者: 唐长智    时间: 2013-3-5 12:05
我查了API,load方法可以接受两种参数,Reder和InputStream都行
[size=-1] void
load(Reader reader)
          按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
[size=-1] void
load(InputStream inStream)
          从输入流中读取属性列表(键和元素对)。
store方法也能接受这两种输入流
[size=-1]void
store(OutputStream out, String comments)
          以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
[size=-1] void
store(Writer writer, String comments)
          以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。
那理论上,纯文本的文件是可以用Reader的,改了你的的代码做实验
  1. [size=14px]                [/size][size=14px]Properties pop =new Properties();[/size]                FileReader fir = new FileReader("lib\\info.txt");
  2.                 //FileInputStream fis = new FileInputStream("lib\\info.txt");
  3.                 //这两个输入流可以随意替换
  4.             pop.load(fir);
  5.             pop.setProperty("ww","asdd");
  6.             //FileWriter fos = new FileWriter("lib\\info.txt");
  7.             FileOutputStream fos = new FileOutputStream("lib\\info.txt");
  8.             //这两个输出流也可以随意替换
  9.             pop.store(fos,"kkk");
  10.             //这里的字符串如果传入中文的话,注释信息是无法显示的,原因是store方法中的编码问题,仅支持单字符编码
  11. [size=14px]            pop.list(System.out);[/size]
  12.             fir.close();
  13. [size=14px]        [/size][size=14px]    fos.close();[/size]
复制代码

作者: 黄玉昆    时间: 2013-3-5 12:25
戴俊毅 发表于 2013-3-5 12:02
1 首先 FileInputStream是字节流   而FileReader是字符流  另外这个属性键值对集合Properties的方法load(In ...

楼下已经把API文档copy上去了,是可以接收Reader类的。应该是可以传进去字符流的
作者: Beautiful    时间: 2013-3-5 12:45
黄玉昆 发表于 2013-3-5 12:25
楼下已经把API文档copy上去了,是可以接收Reader类的。应该是可以传进去字符流的 ...

好吧 我表示我用的是 5.0的API  嘿嘿
作者: 谢洋    时间: 2013-3-5 13:20
版主,可以说下为什么不给技术分?
作者: 明锦添    时间: 2013-3-5 22:28
不一定,可用FileInputStream,所有文件的读取都可用它的,只不过FileReader效力高些。
作者: 黄玉昆    时间: 2013-3-5 22:31
谢洋 发表于 2013-3-5 13:20
版主,可以说下为什么不给技术分?

因为你的技术分已经21了,所以,技术分越高,就不能轻易给技术分了。请谅解,谢谢
作者: 谢洋    时间: 2013-3-5 22:36
黄玉昆 发表于 2013-3-5 22:31
因为你的技术分已经21了,所以,技术分越高,就不能轻易给技术分了。请谅解,谢谢 ...

     明白!
作者: 张宝    时间: 2013-3-6 20:34
学习.....




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