黑马程序员技术交流社区
标题:
请分析运行过程。
[打印本页]
作者:
夜写意
时间:
2013-8-28 06:36
标题:
请分析运行过程。
代码
class RunCount
{
Sop s = new Sop();
RunCount() throws IOException
{
Properties prop = new Properties();
File f = new File("D:\\JavaTest\\RunCount.ini");
if(!f.exists())
f.createNewFile();
FileInputStream fis = new FileInputStream(f);
1号位: FileOutputStream fos = new FileOutputStream(f);
prop.load(fis);
int count = 0;
String value = prop.getProperty("Time");
if(value!=null)
{
count = Integer.parseInt(value);
if(count>=5)
{
s.sop("Time out");
//return;
}
}
count++;
prop.setProperty("Time", count + "");
2号位: FileOutputStream fos = new FileOutputStream(f);
prop.store(fos, "");
fis.close();
fos.close();
}
}
复制代码
问题是:为什么放在1号位的时候,不管运行多少次,Time的值都是1. 但是放在2号位的时候,就可以正常计数?请分析下两个不同位置程序的运行过程有什么不同。
作者:
xuluheng718
时间:
2013-8-28 08:34
输出流,在没显式调用flush()时,所输出的数据还在流中,并没有写入到指定中,只有调用了flush()强制刷新或者调用colse()时才会把流中的数据输出到指定位置。
作者:
杨增坤
时间:
2013-8-28 08:37
首先我不知道你问的什么,那些代码放到一号,和放到二号的啊,但是上面的运行后,count永远是1的,因为你使用的是if语句判断的:
Properties prop = new Properties();
File f = new File("D:\\JavaTest\\RunCount.ini");
if(!f.exists())
f.createNewFile();
FileInputStream fis = new FileInputStream(f);
1号位: FileOutputStream fos = new FileOutputStream(f);
prop.load(fis);
int count = 0;
while(true)
{
String value = prop.getProperty("Time");
if(value!=null)
{
count = Integer.parseInt(value);
if(count>=5)
{
s.sop("Time out");
return;
}
}
count++;
prop.setProperty("Time", count + "");
}
这样就count就可能不是1了。
作者:
影响力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才能正常包装流数据。
//修改后:
FileInputStream fis = new FileInputStream(f);
prop.load(fis);
FileOutputStream fos = new FileOutputStream(f);
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2