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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈国柱 中级黑马   /  2013-9-26 00:13  /  1553 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈国柱 于 2013-9-26 09:45 编辑

如果在(1)处建立输出流,即使不断重复运行代码,time的次数总是为1;但是如果在(2)处建立输出流,time的次数会随着不断重复运行代码而递增,直至超过指定次数,程序给出提示,为什么在两处地方建立输出流,time的次数会有所不同的?应该怎样理解两处建立输出流的区别呢?
  1. package day18to21;
  2. /*
  3. 用于记录应用程序运行次数。
  4. 如果使用次数已到,那么给出注册提示。

  5. */

  6. import java.io.*;
  7. class RunCount
  8. {
  9.         public static void main(String[] args) throws IOException
  10.         {
  11.                 Properties prop = new Properties();

  12.                 File file = new File("count.ini");//新建文件作记录次数使用
  13.                 FileOutputStream fos = new FileOutputStream(file);//(1)在这里建立输出流,count总是为1。
  14.                 if(!file.exists())
  15.                         file.createNewFile();

  16.                 FileInputStream fis = new FileInputStream(file);//将文件先封装,即使文件不存在,而经过是否存在后,如果不存在就创建一个,那么就不会报异常了。建立读取流

  17.                 prop.load(fis);//将流数据加载到集合中。
  18.                
  19.                 int count = 0;
  20.                 String value = prop.getProperty("time");
  21.                 if(value!=null)
  22.                 {
  23.                         count = Integer.parseInt(value);
  24.                         if (count>5)
  25.                         {
  26.                                 System.out.println("拿钱,不然用不了");
  27.                                 return;
  28.                         }
  29.                 }


  30.                 count++;

  31.                 prop.setProperty("time",count+"");

  32. //                FileOutputStream fos = new FileOutputStream(file);//(2)建立输出流,计数器才有效。

  33.                 prop.store(fos,"");
  34.                
  35.                 fos.close();
  36.                 fis.close();
  37.         }
  38. }



复制代码

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 早知道 于 2013-9-26 00:51 编辑
  1. int count = 0;
  2. String value = prop.getProperty("time");
  3. System.out.println(value);
复制代码
加了行输出语句,发现value的值为空。我觉得是你每回都在新建一个文件,每次都是第一次读取配置文件。所以出现这种状况。
查了下API发现public FileOutputStream(File file)的解释:
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。创建一个新 FileDescriptor 对象来表示此文件连接。即每次调用都是重新创建文件。
所以你放于位置1下面的代码就没有意义了
  1. if(!file.exists())
  2. file.createNewFile();

复制代码

评分

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

查看全部评分

回复 使用道具 举报
运行了一下你的代码,没有任何的输出,其实这也很好解释,因为你根本没有与程序进行交互的代码,你的问题,我看了下,大概是这个原因,
  1. Properties prop = new Properties();

  2.                 File file = new File("count.ini");//新建文件作记录次数使用
  3.                 FileOutputStream fos = new FileOutputStream(file);//(1)在这里建立输出流,count总是为1。
  4.                 if(!file.exists())
  5.                         file.createNewFile();
复制代码
这里很显然文件count.ini是不存在的,你此时初始化fos,file是null ,所以才会导致你所说的结果。另外一方面,你在后面进行初始化fos,那时候count.ini已经初始化好了,所以能行是可以理解的。最后我有点不明白的地方时,你的代码里既没有循环也没有迭代,你的count++不管怎么说只能执行一次,怎么才能让他加到5呢,所以感觉你的程序很怪。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 很给力!

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题至“已解决”。
回复 使用道具 举报
楼上 File file = new File("count.ini");//新建文件作记录次数使用
                FileOutputStream fos = new FileOutputStream(file);//(1)在这里建立输出流,count总是为1。
此时的file对象都还没有被创建,用流关联起来也没用。
if(!file.exists())
         file.createNewFile();
把这个判断语句放前面。。。。


评分

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

查看全部评分

回复 使用道具 举报
暮雨 发表于 2013-9-26 00:43
运行了一下你的代码,没有任何的输出,其实这也很好解释,因为你根本没有与程序进行交互的代码,你的问题, ...

不是程序自己循环执行5次代码,是每运行一次后,手动点击运行至少5次代码,就好像一个软件一样,你用完一次之后,关闭了,然后下次使用的时候再点击打开
回复 使用道具 举报
关于FileOutputStream fos = new FileOutputStream(file);
这句话的意思是 创建了一个count.ini文件。
当FileOutputStream fos = new FileOutputStream(file);放在(1)处时,原来的count.ini已经被删除。现在的count.ini里面内容为空。
所以当输入流读取到这个count.ini文件时,其实里面什么东西也没有。所以得到的value也为null.if语句一直都是flase,count 从没被value赋过值。
最后输入流将count++(也就是0加1)写入到count.ini中。第二次执行时,原先的count.ini被删除,所以次数一直为1.
而当FileOutputStream fos = new FileOutputStream(file);放在(2)处时,是输入流先读取到count.ini文件从而得到次数。count被value赋值。
最后输出流将自增后的次数,写入到count.ini中。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马