A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄玉昆 黑马帝   /  2013-3-5 11:05  /  2004 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄玉昆 于 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.         }
复制代码

11 个回复

倒序浏览
1、如果是文本,用字节流字符流都行。
2、先有字节流,后有字符流;字节流可以读取任意的二进制数文件,他操作时不进行编码;
而字符流存取经过字符编码的文件,也就是说他在存取是都是经过查编码表的(而码表是固定的二制进数据;
3、面上是通过字节流往txt文件是存进去的是字符数据(字符数据不是任意的二进制数)对应的二进制数,这时存入的二进制数据不可能是任意的
当我们在打开txt文件时,txt文件会把这些二进制数根据它默认的编码表来查得到相应的字符,然后再显示出来
  如果我们把任意的二制数据存入文本时,就会出现乱码
4、当我们用字符流去操作非文本文件是会发生什么问题?
   首先,非文本件的内的数据是任意的二进制数据,既然是任意的,那么字符流在查码表时,这些任意的二进制数,
  很有可以在码表找不到相对应的字符的编码,这就是乱码的由来发了

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
用FileReader 可能出现乱码 不好处理 ,他没有处理乱码的构造方法最好用FileInputStream

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9

查看全部评分

回复 使用道具 举报
本帖最后由 戴俊毅 于 2013-3-5 12:04 编辑

1 首先 FileInputStream是字节流   而FileReader是字符流  另外这个属性键值对集合Properties的方法load(InputStream inStream) 往里面传的是字节流数据,所以 你特地转化为字符流还传不进去了所以这里要用字节流,而是不是一定要用FileInputStream呢 ,得出结论你这里可以用InputStream来接收也可以,比如在反射里面不是有通过  主函数类名.class.getClassLoader().getResourceAsStream(详细的文件路径及文件名称)来获得一InPutStream对象么,所以 还真不一定一定要用FileInputStream。
2 为什么纯文本文件能用字节流,首先我们得明确一下字符流的由来,字节流一般都是可以搞定,但是有一种数据是非常常见的,文本文件,这个时候就单独分离出一块字符流,根据编码表来查找文字,提高了效率。所以字符流里面是整合了编码表提高了读取的效率,而字节流里面没有编码表。所以你知道了我们一般情况文本文件为什么用字符流了吧,为了提高效率啊,另外字节流去读取文本文件也是可以胜任的。所以我们才会有字节流通向字符流的通道InputstreamReader,因为转化为字符流之后能提高效率,比如转化为字符流之后那个BufferedReader里面有个方法ReadLine方法一行一行读,处理器文本文件更加快。
个人愚见,希望对你有帮助,对错有待大家交流学习。

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 淡定

查看全部评分

回复 使用道具 举报
我查了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]
复制代码

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
戴俊毅 发表于 2013-3-5 12:02
1 首先 FileInputStream是字节流   而FileReader是字符流  另外这个属性键值对集合Properties的方法load(In ...

楼下已经把API文档copy上去了,是可以接收Reader类的。应该是可以传进去字符流的
回复 使用道具 举报
黄玉昆 发表于 2013-3-5 12:25
楼下已经把API文档copy上去了,是可以接收Reader类的。应该是可以传进去字符流的 ...

好吧 我表示我用的是 5.0的API  嘿嘿
回复 使用道具 举报
版主,可以说下为什么不给技术分?
回复 使用道具 举报
不一定,可用FileInputStream,所有文件的读取都可用它的,只不过FileReader效力高些。
回复 使用道具 举报
谢洋 发表于 2013-3-5 13:20
版主,可以说下为什么不给技术分?

因为你的技术分已经21了,所以,技术分越高,就不能轻易给技术分了。请谅解,谢谢
回复 使用道具 举报
黄玉昆 发表于 2013-3-5 22:31
因为你的技术分已经21了,所以,技术分越高,就不能轻易给技术分了。请谅解,谢谢 ...

     明白!
回复 使用道具 举报
学习.....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马