黑马程序员技术交流社区

标题: 请分析运行过程。 [打印本页]

作者: 夜写意    时间: 2013-8-28 06:36
标题: 请分析运行过程。
代码
  1. class RunCount
  2. {
  3.         Sop s = new Sop();
  4.         RunCount() throws IOException
  5.         {
  6.                 Properties prop = new Properties();
  7.                 File f = new File("D:\\JavaTest\\RunCount.ini");
  8.                 if(!f.exists())
  9.                         f.createNewFile();
  10.                 FileInputStream fis = new FileInputStream(f);
  11. 1号位:   FileOutputStream fos = new FileOutputStream(f);               
  12.                 prop.load(fis);
  13.                 int count = 0;
  14.                
  15.                 String value = prop.getProperty("Time");
  16.                 if(value!=null)                        
  17.                 {
  18.                         count = Integer.parseInt(value);
  19.                         if(count>=5)
  20.                         {
  21.                                 s.sop("Time out");
  22.                                 //return;
  23.                         }                        
  24.                 }
  25.                 count++;
  26.                 prop.setProperty("Time", count + "");
  27.                
  28. 2号位:   FileOutputStream fos = new FileOutputStream(f);               
  29.                 prop.store(fos, "");

  30.                 fis.close();
  31.                 fos.close();
  32.         }
  33.         
  34. }
复制代码
问题是:为什么放在1号位的时候,不管运行多少次,Time的值都是1.  但是放在2号位的时候,就可以正常计数?请分析下两个不同位置程序的运行过程有什么不同。


作者: xuluheng718    时间: 2013-8-28 08:34
输出流,在没显式调用flush()时,所输出的数据还在流中,并没有写入到指定中,只有调用了flush()强制刷新或者调用colse()时才会把流中的数据输出到指定位置。
作者: 杨增坤    时间: 2013-8-28 08:37
首先我不知道你问的什么,那些代码放到一号,和放到二号的啊,但是上面的运行后,count永远是1的,因为你使用的是if语句判断的:


作者: 影响力147753321    时间: 2013-8-28 08:42
FileOutputStream fos = new FileOutputStream(f);  放在前面每次运行时会 会重建一个文件。相当于每次重新存入值。 FileOutputStream fos = new FileOutputStream(f);  放在后面每次运行时会 也会重建一个文件。但是它能保证每次读到上次存入值的文件。所以可计数
二者区别就是在重建文件时能否读到原来的文件信息。在1处没读到,而在2处已读到。

作者: 老衲玩IT    时间: 2013-8-28 13:36
同学你把简单的问题问得复杂了,其实不一定放在你指定的2号位新建dos对象才有效,放在prop.load(fis)后面就行,原因是dis和dos引用的参数是同一个f,只有dis的流数据被处理完,dos才能正常包装流数据。
  1. //修改后:
  2. FileInputStream fis = new FileInputStream(f);
  3. prop.load(fis);
  4. FileOutputStream fos = new FileOutputStream(f);               
  5.                
复制代码





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