黑马程序员技术交流社区
标题:
关于输出流的疑惑
[打印本页]
作者:
陈国柱
时间:
2013-9-26 00:13
标题:
关于输出流的疑惑
本帖最后由 陈国柱 于 2013-9-26 09:45 编辑
如果在(1)处建立输出流,即使不断重复运行代码,time的次数总是为1;但是如果在(2)处建立输出流,time的次数会随着不断重复运行代码而递增,直至超过指定次数,程序给出提示,为什么在两处地方建立输出流,time的次数会有所不同的?应该怎样理解两处建立输出流的区别呢?
package day18to21;
/*
用于记录应用程序运行次数。
如果使用次数已到,那么给出注册提示。
*/
import java.io.*;
class RunCount
{
public static void main(String[] args) throws IOException
{
Properties prop = new Properties();
File file = new File("count.ini");//新建文件作记录次数使用
FileOutputStream fos = new FileOutputStream(file);//(1)在这里建立输出流,count总是为1。
if(!file.exists())
file.createNewFile();
FileInputStream fis = new FileInputStream(file);//将文件先封装,即使文件不存在,而经过是否存在后,如果不存在就创建一个,那么就不会报异常了。建立读取流
prop.load(fis);//将流数据加载到集合中。
int count = 0;
String value = prop.getProperty("time");
if(value!=null)
{
count = Integer.parseInt(value);
if (count>5)
{
System.out.println("拿钱,不然用不了");
return;
}
}
count++;
prop.setProperty("time",count+"");
// FileOutputStream fos = new FileOutputStream(file);//(2)建立输出流,计数器才有效。
prop.store(fos,"");
fos.close();
fis.close();
}
}
复制代码
作者:
早知道
时间:
2013-9-26 00:40
本帖最后由 早知道 于 2013-9-26 00:51 编辑
int count = 0;
String value = prop.getProperty("time");
System.out.println(value);
复制代码
加了行输出语句,发现value的值为空。我觉得是你每回都在新建一个文件,每次都是第一次读取配置文件。所以出现这种状况。
查了下API发现public
FileOutputStream
(File file)的解释:
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。创建一个新 FileDescriptor 对象来表示此文件连接。即每次调用都是重新创建文件。
所以你放于位置1下面的代码就没有意义了
if(!file.exists())
file.createNewFile();
复制代码
作者:
暮雨
时间:
2013-9-26 00:43
运行了一下你的代码,没有任何的输出,其实这也很好解释,因为你根本没有与程序进行交互的代码,你的问题,我看了下,大概是这个原因,
Properties prop = new Properties();
File file = new File("count.ini");//新建文件作记录次数使用
FileOutputStream fos = new FileOutputStream(file);//(1)在这里建立输出流,count总是为1。
if(!file.exists())
file.createNewFile();
复制代码
这里很显然文件count.ini是不存在的,你此时初始化fos,file是null ,所以才会导致你所说的结果。另外一方面,你在后面进行初始化fos,那时候count.ini已经初始化好了,所以能行是可以理解的。最后我有点不明白的地方时,你的代码里既没有循环也没有迭代,你的count++不管怎么说只能执行一次,怎么才能让他加到5呢,所以感觉你的程序很怪。
作者:
黄炳期
时间:
2013-9-26 08:02
如果问题已经解决,请及时修改主题至“已解决”。
作者:
杨修
时间:
2013-9-26 09:34
楼上 File file = new File("count.ini");//新建文件作记录次数使用
FileOutputStream fos = new FileOutputStream(file);//(1)在这里建立输出流,count总是为1。
此时的file对象都还没有被创建,用流关联起来也没用。
if(!file.exists())
file.createNewFile();
把这个判断语句放前面。。。。
作者:
陈国柱
时间:
2013-9-26 09:44
暮雨 发表于 2013-9-26 00:43
运行了一下你的代码,没有任何的输出,其实这也很好解释,因为你根本没有与程序进行交互的代码,你的问题, ...
不是程序自己循环执行5次代码,是每运行一次后,手动点击运行至少5次代码,就好像一个软件一样,你用完一次之后,关闭了,然后下次使用的时候再点击打开
作者:
张文豪
时间:
2013-9-26 17:01
关于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中。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2