黑马程序员技术交流社区

标题: 请教关于流的问题 [打印本页]

作者: 月光海    时间: 2014-4-15 10:35
标题: 请教关于流的问题
  1. public static void fun6()throws IOException
  2.         {
  3.                 Properties prop=new Properties();
  4.                 File file=new File("d:\\prop.ini");
  5.                 if(!file.exists())
  6.                 {
  7.                         file.createNewFile();
  8.                 }
  9.                 FileInputStream fis=new FileInputStream(file);
  10.                 FileOutputStream fos=new FileOutputStream(file);
  11.                 prop.load(fis);

  12.                 if(prop.getProperty("time")!=null)
  13.                 {
  14.                         String value=prop.getProperty("time");
  15.                         int time=Integer.parseInt(value);
  16.                         if(time>5)
  17.                         {
  18.                                 sop("拿钱");
  19.                                 return;
  20.                         }
  21.                         time++;
  22.                         prop.setProperty("time",""+time);
  23.                        
  24.                 }
  25.                 else
  26.                 {
  27.                         int time=0;
  28.                         time++;
  29.                         prop.setProperty("time",""+time);
  30.                         //prop.store(fos,"");
  31.                 }
  32.                
  33.                 prop.store(fos,"");
  34.         }
复制代码

FileOutputStream fos=new FileOutputStream(file);我的这个写入流定义在现在这个位置就无法完成程序的计数任务,定义在prop.store(fos,"");的前面一句就可以,这是为什么呢,我在前面定义了写入流但我没使用,和在下面定义有什么区别呢?求指教

作者: 月光海    时间: 2014-4-15 11:24
没人来回答吗???神那,救救我吧!!!!!!!!!!!!!
作者: ﹊佑雨时杰↘    时间: 2014-4-15 14:11
因为FileOutputStream fos = new FileOutputStream(file);放在prop.setProperty("time", "" + time); 后面 输出流文件 的已近prop属性已近改过了。  而你代码中写的FileOutputStream fos = new FileOutputStream(file); 的位置关联的file 每次对应的相当于一个新的文件吧    你自己理解一下
作者: 也许依然    时间: 2014-4-15 14:45
定义在前后都可以的
比如:
  1. public static void main(String[] args)throws Exception {
  2.                 // TODO Auto-generated method stub
  3.                 Properties prop = new Properties();
  4.                
  5.                 //将文件封装为对象,方便判断
  6.                 File file = new File("d:\\","count.ini");
  7.                
  8.                 //判断文件是否存在
  9.                 if(!file.exists())
  10.                         file.createNewFile();
  11.                
  12.                 FileInputStream fis = new FileInputStream(file);
  13.                 FileOutputStream fos = new FileOutputStream(file);
  14.                
  15.                 prop.load(fis);
  16.                
  17.                 int count = 0;
  18.                 String value = prop.getProperty("time");
  19.                 if(value!=null){
  20.                         count = Integer.parseInt(value);
  21.                         if(count>=5)
  22.                                 System.out.println("使用次数已到");
  23.                 }
  24.                 count++;
  25.                 prop.setProperty("time", count+"");
  26.                
  27.                
  28.                 prop.store(fos, "");
  29.                
  30.                 fis.close();
  31.                 fos.close();
  32.         }
复制代码

作者: 曹冬明    时间: 2014-4-15 15:15
请问楼上是否验证过代码呢,我用你的代码运行之后结果和楼主的一样,都是不计数,而将这句代码FileOutputStream fos = new FileOutputStream(file);写在这句prop.store(fos, "");上面(不一定连在一起,中间可以穿插别的代码,比如你随便输出点什么都没问题),就没有问题,这个东西我也弄了半天,就是只要将中间计数的代码放在FileOutputStream对象的定义之前都可以成功计数,否则就不行
作者: 坏米饭    时间: 2014-4-15 15:58
经验证 FileOutputStream fos = new FileOutputStream(file);必须在prop.load(fis)后面。原理尚不明确。 经测试,发现             FileInputStream fis = new FileInputStream(file);            
            prop.load(fis);//
            FileOutputStream fos = new FileOutputStream(file);
            prop.load(fis);//这里load(),仍然可以正常计数。
作者: 月光海    时间: 2014-4-15 16:04
坏米饭 发表于 2014-4-15 15:58
经验证 FileOutputStream fos = new FileOutputStream(file);必须在prop.load(fis)后面。原理尚不明确。  ...

如果在我的代码中把输出流放在prop.load(fis)的后面的话,一直执行那么就会发现,计数到一定次数,会显示拿钱,然后再执行的话计数器会初始化,会重新计数的,
作者: 坏米饭    时间: 2014-4-15 17:31
月光海 发表于 2014-4-15 16:04
如果在我的代码中把输出流放在prop.load(fis)的后面的话,一直执行那么就会发现,计数到一定次数,会显 ...

那因为你写的   sop("拿钱");
                                return;//return去掉就不重新计数了。
作者: 月光海    时间: 2014-4-15 17:38
坏米饭 发表于 2014-4-15 17:31
那因为你写的   sop("拿钱");
                                return;//return去掉就不重新计数了。 ...

那我判断这个配置文件里的参数就没有意义了,不return的话软件不是还能继续使用吗?
作者: 坏米饭    时间: 2014-4-15 17:44
月光海 发表于 2014-4-15 17:38
那我判断这个配置文件里的参数就没有意义了,不return的话软件不是还能继续使用吗? ...

噢~ return前面加一句prop.store(fos,"");//可能是因为要关闭资源吧。具体我真不懂。




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