黑马程序员技术交流社区

标题: 关于Properties的记录程序运行次数的程序 [打印本页]

作者: 卜弦    时间: 2013-10-31 15:52
标题: 关于Properties的记录程序运行次数的程序
本帖最后由 卜弦 于 2013-11-1 14:12 编辑
  1. import java.io.*;
  2. import java.util.*;

  3. class  RunCount
  4. {
  5.         public static void main(String[] args) throws IOException
  6.         {
  7.                 count_fuc();
  8.         }
  9.         public static void count_fuc()throws IOException
  10.         {
  11.                 Properties pro = new Properties();
  12.                 File file = new File("info.txt");
  13.                 if(!file.exists())
  14.                         file.createNewFile();
  15.                
  16.                 FileReader fr = new FileReader(file);
  17.                
  18.                 pro.load(fr);    //第一句
  19.                 FileWriter fw = new FileWriter(file);//第二句
  20.                 int count=0;
  21.                 String value = pro.getProperty("time");
  22.                 if (value!=null)
  23.                 {
  24.                         count = Integer.parseInt(value);                                                        
  25.                         //System.out.println("count:"+pro.getProperty("time"));
  26.                         if (count>=5)
  27.                         {
  28.                                 System.out.println("次数已到,请注册!");
  29.                                 
  30.                         }               
  31.                
  32.                 }               
  33.                         count++;
  34.                         pro.setProperty("time",count+"");
  35.                         
  36.                         pro.store(fw,"go");
  37.                         fw.close();
  38.                         fr.close();
  39.         }
  40. }
复制代码
很纠结,想不明白。程序中有两句话被我注释了“第一句”和“第二句”。这是毕老师讲的关于将属性用一个文件记录然后记录程序运行次数的。
现在的程序是可以正常运行的,当我把这两句话调换顺序之后不论程序运行多少次time就始终等于1,我实在想不明白这两句话调换顺序有什么不同。
谁对这个有自己理解的可否给我讲讲。
作者: 阿里策    时间: 2013-10-31 18:41
本帖最后由 阿里策 于 2013-10-31 18:43 编辑

    我是这样理解的:前提是 FileWriter fw = new FileWriter(file);他会新建一个file文件。
当你的第一句和第二句互换之后,第一次运行改程序,没有什么问题,time变为1;当第二次运行时,运行到FileReader fr = new FileReader(file);这里生成了一个对info.txt的读取流,这是info.txt是上一次运行后得到的文件。但是这时读取流生成但是并没有读取原有的info.txt。紧接着执行FileWriter fw = new FileWriter(file);又生成了一个新的info.txt文件,这里面空的。然后执行pro.load(fr);读取之前生成的跟info.txt关联的流,这时info.txt是这次运行新生成的空文件了,而不是上次运行得到的原文件了。所以,获取的value结果是null,这样接下来执行,time就会变成1,存进info.txt。
   这样,每次执行这个程序,都是走同样的过程,就是先生成一个新的info.txt,然后再读取,所以永远time是1.


作者: 卜弦    时间: 2013-10-31 20:59
本帖最后由 卜弦 于 2013-10-31 21:02 编辑
阿里策 发表于 2013-10-31 18:41
我是这样理解的:前提是 FileWriter fw = new FileWriter(file);他会新建一个file文件。
当你的第一句 ...

我看了你的回复  试着把程序改了一下,感觉还是不太对。我把 FileWriter fw = new FileWriter(file)去掉了,然后在当前文件夹建了一个info.txt的空文档对应部分改为 :
                FileReader fr = new FileReader("info.txt");        
                FileWriter fw = new FileWriter("info.txt");
不过结果还是一样的。。。。或者加上一句:System.out.println(file.createNewFile());  发现输出结果为false  应该没创建新的文件。

作者: The_Wizard    时间: 2013-11-1 13:22
FileWriter fw = new FileWriter(file);    //第二句  是会新建一个文件的,如果有同名文件,那个文件将被删除掉。
这时候你调用 pro.load(fr);    //第一句  pro中是没有time的。
然后你定义了一个 count = 0; 并且后边你 ++了。
不过你可以将第二句修改一下:FileWriter fw = new FileWriter(file, true); 。这样如果通过这个流写入数据的话,是追加。
作者: 阿里策    时间: 2013-11-1 18:07
卜弦 发表于 2013-10-31 20:59
我看了你的回复  试着把程序改了一下,感觉还是不太对。我把 FileWriter fw = new FileWriter(file)去掉了 ...

    应该就是FileWriter创建新文件的问题,视频里毕老师也讲过,FileWriter会创建新文件覆盖老文件。
至于System.out.println(file.createNewFile());输出结果为false,当你执行打印file.createNewFile()时,info.txt文件已经被FileWriter创建完毕了,而file的特点是,只要该文件已经存在,就不会再执行创建操作,所以当然返回一个false结果。
作者: 阿里策    时间: 2013-11-1 18:15
The_Wizard 发表于 2013-11-1 13:22
FileWriter fw = new FileWriter(file);    //第二句  是会新建一个文件的,如果有同名文件,那个文件将被 ...

    我感觉这样不太准确,这样info.txt中会连续记录多个time键值对,会不会造成什么副作用?




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