黑马程序员技术交流社区

标题: 关于IO的一个小问题,求高手解决 [打印本页]

作者: (0.0)’    时间: 2013-10-12 22:40
标题: 关于IO的一个小问题,求高手解决
本帖最后由 (0.0)’ 于 2013-10-14 00:33 编辑

  1. <P>package cn.itcast;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileReader;
  6. import java.io.FileWriter;
  7. import java.io.IOException;
  8. import java.util.Properties;

  9. public class CounterPropertiesTest {
  10.         public static void main(String[] args) {
  11.                 // 根据properties来定义一个用户使用软件的计数器,时间到了就不能继续使用、
  12.                 Properties pro = new Properties();
  13.                 File file = new File("properties.ini");

  14.                 BufferedWriter bw = null;
  15.             BufferedReader br = null;

  16.                 int count = 0;

  17.                 if (!file.exists()){
  18.                         try {
  19.                                 file.createNewFile();
  20.                         } catch (IOException e) {
  21.                                 // TODO Auto-generated catch block
  22.                                 e.printStackTrace();
  23.                         }
  24.                 }
  25.                 try {

  26.                         br = new BufferedReader(new FileReader(file));
  27.                         pro.load(br);
  28.                         
  29.                         String value = pro.getProperty("time");
  30.                         System.out.println(value);
  31.                         if (value != null) {                                  </P>
  32. <P>                            count = Integer.parseInt(value);
  33.                                 if (count >= 5) {
  34.                                         System.out.println("使用次数已到,请付费激活!!");
  35.                                         return ;
  36.                                 }
  37.                         }</P>
  38. <P>                        count++;
  39.                         
  40.                         System.out.println("欢迎使用软件!!"+count);
  41.                         pro.setProperty("time", count + "");
  42.                         
  43.                         
  44.                         bw = new BufferedWriter(new FileWriter(file));
  45.                         pro.store(bw, "");

  46.                 } catch (IOException e) {
  47.                         // TODO Auto-generated catch block
  48.                         e.printStackTrace();
  49.                 } finally {
  50.                         try {
  51.                                 if (bw != null)
  52.                                         bw.close();
  53.                         } catch (IOException e) {
  54.                                 // TODO Auto-generated catch block
  55.                                 e.printStackTrace();
  56.                         }
  57.                         try {
  58.                                 if (br != null)
  59.                                         br.close();
  60.                         } catch (IOException e) {
  61.                                 // TODO Auto-generated catch block
  62.                                 e.printStackTrace();
  63.                         }
  64.                 }
  65.         }
  66. }
  67. </P>
复制代码
1、为什么在pro.load(br)前面时,value的值会是null。
2、在pro.load(br)之后,if之前,value的值会从1-5之间变化,不能实现使用时间到了,就不可以使用的效果
3、而在if之后就可以实现使用时间到了,并提升软件时间到了,且文件中的time会是5.

作者: bird_not_fat    时间: 2013-10-12 23:40
1.先回答你第一个问题,bw = new BufferedWriter(new FileWriter(file));这句话只要你放到
pro.load(br);语句之后是都能成功记数的。这是因为如果你在load()之前创建这个输出流对象的话,文件是会重新创建覆盖原有文件的,这个配置文件就变成空文件了,所以不可能记数了。
2.第二个问题,三种情况:
第一种:如果最开始的时候你的配置文件不存在,那么你用file.createNewFile();语句创建出来的配置文件里面什么都没有是空的,String value = pro.getProperty("time");当然为空。你在后面的语句中pro.setProperty("time", count + "");pro.store(bw, "");在这个配置文件中写入了time=1,所以之后再次启动程序,value就不为空了。
第二种:如果最开始你的配置文件存在,但是文件中什么都没有,就和第一种情况一样了。
第三种:如果最开始你的配置文件存在,并且里面有time=0,这时候String value = pro.getProperty("time");就肯定不会是空值。
作者: bird_not_fat    时间: 2013-10-12 23:43
补充一句,pro.load(br);语句是将配置文件中的键值对加载到内存中,在这个语句之后再写bw = new BufferedWriter(new FileWriter(file));语句,虽然仍然将原有配置文件覆盖成空的了,但是此时你的内存中已经有了加载进来的键值对了,再操作就是内存中的处理了,最后store方法可以将内存中的数据全部输出到配置文件中。
作者: 杨增坤    时间: 2013-10-13 08:07
1、为什么输出流放在if之前就会出现无法计数的效果,并且读出的数字 为null;
2、为什么放在String value的后面文件中的数据会被清空???



首先第一个问题:
  解答:为什么会出现null.那是因为当你第一次运行的时候,不存在properties.ini文件,当然里面就没有time属性,所以为空,
            当你第二次运行的时候,就不会是空值,以为文件已经存在并且里面有time属性和对应的值。


第二个问题:
      解答:bw = new BufferedWriter(new FileWriter(file));   pro.store(bw, "");这不是在清空,而是把更改后的数据,重新加载到文件就,就是把time更改的后值,也要早文件中更改,pro.store(bw, "");中的"",那是注释,也可以不写空,也可以写其他的,
              为什么不能放到前面:其实也可以放到前面,运行也不会出错,但是是无意义的,只有在文件中的信息被更改了,这样才需要把更改的数据加载的文件中。


希望对你有帮助!

作者: To    时间: 2013-10-13 13:53
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
作者: (0.0)’    时间: 2013-10-14 00:21
bird_not_fat 发表于 2013-10-12 23:43
补充一句,pro.load(br);语句是将配置文件中的键值对加载到内存中,在这个语句之后再写bw = new BufferedWr ...

没看大明白。
在pro.load(br);之前,time一直会出null
而在proload(br);之后,if之前 ; time会从0-5变化,再由0-5,也不是我需要的,
而在if之后就可以了,time到1-5 变,time到5后就提升使用次数已到,这才是我需要的,但是为什么要放在if之后才可以实现这个功能呢??
作者: (0.0)’    时间: 2013-10-14 00:25
杨增坤 发表于 2013-10-13 08:07
1、为什么输出流放在if之前就会出现无法计数的效果,并且读出的数字 为null;
2、为什么放在String value的 ...

回答的不是我要问的问题啊?
代码没问题,就是bw=new BufferedWriter(new FileWriter(file));
放置位置不同,会出现3中情况而已,不明白为什么在if之后就可以实现计数功能了。
作者: To    时间: 2013-10-14 09:50
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




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