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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© (0.0)’ 高级黑马   /  2013-10-12 22:40  /  1496 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 (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.

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

7 个回复

倒序浏览
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");就肯定不会是空值。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
补充一句,pro.load(br);语句是将配置文件中的键值对加载到内存中,在这个语句之后再写bw = new BufferedWriter(new FileWriter(file));语句,虽然仍然将原有配置文件覆盖成空的了,但是此时你的内存中已经有了加载进来的键值对了,再操作就是内存中的处理了,最后store方法可以将内存中的数据全部输出到配置文件中。

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
1、为什么输出流放在if之前就会出现无法计数的效果,并且读出的数字 为null;
2、为什么放在String value的后面文件中的数据会被清空???



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


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


希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-13 13:53:47
报纸
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
回复 使用道具 举报
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之后才可以实现这个功能呢??
回复 使用道具 举报
杨增坤 发表于 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:55
8#
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马