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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卜弦 中级黑马   /  2013-10-31 15:52  /  1209 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 卜弦 于 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,我实在想不明白这两句话调换顺序有什么不同。
谁对这个有自己理解的可否给我讲讲。

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 阿里策 于 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.

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 卜弦 于 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  应该没创建新的文件。
回复 使用道具 举报
FileWriter fw = new FileWriter(file);    //第二句  是会新建一个文件的,如果有同名文件,那个文件将被删除掉。
这时候你调用 pro.load(fr);    //第一句  pro中是没有time的。
然后你定义了一个 count = 0; 并且后边你 ++了。
不过你可以将第二句修改一下:FileWriter fw = new FileWriter(file, true); 。这样如果通过这个流写入数据的话,是追加。

评分

参与人数 2技术分 +1 黑马币 +30 收起 理由
乔兵 + 1
卜弦 + 30 的确是这样!顿时明白了~~~哈

查看全部评分

回复 使用道具 举报
卜弦 发表于 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结果。
回复 使用道具 举报
The_Wizard 发表于 2013-11-1 13:22
FileWriter fw = new FileWriter(file);    //第二句  是会新建一个文件的,如果有同名文件,那个文件将被 ...

    我感觉这样不太准确,这样info.txt中会连续记录多个time键值对,会不会造成什么副作用?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马