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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*
要求:
当一个程序使用五次以后,就要停止运行,并且提示续费
思路:        首先程序运行次数需要用计数器,并且需要以键值对的方式进行存储,所以可以采用map集合.
                程序退出后,内存清空,所以下次开始时候又有重零开始,所以需要把这个次数输出到硬盘文件上,下次打开程序时候,要加载进来
                同时,计数器要加上1,并且覆盖掉以前的数值,因此需要一个输入流,和输出流。map集合与io联系最紧密的是Properties

*/
import java.util.*;
import java.io.*;
class Jishu
{
        public static void main(String[] args) throws Exception
        {
                Properties p=new Properties();
                File f=new File("log.txt");
                if(!f.exists())
                        f.createNewFile();
                BufferedReader br=new BufferedReader(new FileReader(f));//可以使用Properties里面的load方法获取键值对,下次储存可以用store
                BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream(f));
                int count=0;
                p.load(br);// 键值对储存在p里面
                if(p.getProperty("name")!=null)
                {       
                        count=Integer.parseInt(p.getProperty("name"));//这一步是关键,因为如果存在键值对,就要把值取出,赋给count,然后自加
                        count++;
                        if(count>=5)
                        {
                                System.out.println("给钱!!!!");
                                return;//break和return差别????
                        }
                        p.setProperty("name",""+count);
                }
                       
                else
                {
                        count++;//如果没有键值对就不需取出
                        p.setProperty("name",count+"");
                }
                p.store(bo,"");
        }
}

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 淡定

查看全部评分

11 个回复

倒序浏览
本帖最后由 Jim-剣◆﹏ 于 2013-11-30 17:04 编辑

经过摸索,不过还是细节问题,知道了你的问题所在
关键在于这段代码
  1. Properties p = new Properties();
  2.                 File f = new File("D:\\test\\log.txt");
  3.                 if (!f.exists())
  4.                         f.createNewFile();
  5.                 BufferedReader br = new BufferedReader(new FileReader(f))
  6.                 BufferedOutputStream bo = new BufferedOutputStream(
  7.                                 new FileOutputStream(f));
  8.                 int count = 0;
  9.                 p.load(br);// 键值对储存在p里面
复制代码



因为在执行p.load(br);加载配置文件的前面有这句代码
BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(f));
而new FileOutputStream(f))表示的是,新建新的文件覆盖原来的文件,但是显然,楼主每次都要存储数据然后读取,如果覆盖了则是空白的文本文件
所以就导致了每一次加载p.load(br);配置文件,读取的都是空的文本文件,所以每次都会执行else里面的语句,无论你执行多少次,每一次都是这样
记得如果要续写的话,有个重载方法,在后面加true
  1. Properties p = new Properties();
  2.                 File f = new File("D:\\test\\log.txt");
  3.                 if (!f.exists())
  4.                         f.createNewFile();
  5.                 BufferedReader br = new BufferedReader(new FileReader(f))
  6.                 BufferedOutputStream bo = new BufferedOutputStream(
  7.                                 new FileOutputStream(f,ture));
  8.                 int count = 0;
  9.                 p.load(br);// 键值对储存在p里面
复制代码



BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(f,true));
这样可以解决问题,但是不建议这样写,因为里面是续写的形式,如果配置信息很多,会占用空
建议写在末尾,直接写这句BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(f));
由于前面正确读取到配置信息,其余应该不用我解释了

评分

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

查看全部评分

回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-11-30 14:04
这是我写的
一对比,发现你最后少了一句输出流语句FileOutputStream fos = new FileOutputStream(file);
...

不是,我写了,写在开始了。load(br)这步没有在输入流中储存键值对是为什么?
回复 使用道具 举报
怎么没人解答啊?????等求解答
回复 使用道具 举报

回复

本帖最后由 Jim-剣◆﹏ 于 2013-11-30 17:06 编辑


楼上更新
回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-11-30 15:25
好吧,原来你写在了上面,我试验过了,你把
BufferedOutputStream bo = new BufferedOutputStream(new Fi ...

原因呢?
回复 使用道具 举报
潜伏 中级黑马 2013-11-30 15:45:52
7#

同求!!!!!
回复 使用道具 举报
本帖最后由 Jim-剣◆﹏ 于 2013-11-30 17:04 编辑

楼上更新了
回复 使用道具 举报
本帖最后由 Jim-剣◆﹏ 于 2013-11-30 17:05 编辑

楼上更新了
回复 使用道具 举报
潜伏 中级黑马 2013-11-30 18:32:52
10#
Jim-剣◆﹏ 发表于 2013-11-30 14:04
经过摸索,不过还是细节问题,知道了你的问题所在
关键在于这段代码

你真是细心的人,有实力,不过为什么配置文件过多占用配置信息啊?先加载后加载这句话,不都是加载吗?只创建一个对象而已,你是想说它存在的时间过长吗?
另外能不能给个联系方式,以便日后讨教???
回复 使用道具 举报
本帖最后由 Jim-剣◆﹏ 于 2013-11-30 19:23 编辑
潜伏 发表于 2013-11-30 18:32
你真是细心的人,有实力,不过为什么配置文件过多占用配置信息啊?先加载后加载这句话,不都是加载吗?只 ...

不是啊,我说的占用空间不是指对象占用
是你采用续写的方式,运行几遍之后,那么配置文件里的内容会是这样:
#
#Sat Nov 30 16:48:09 CST 2013
name=1
#
#Sat Nov 30 16:56:18 CST 2013
name=2
#
#Sat Nov 30 16:56:19 CST 2013
name=3
#
#Sat Nov 30 16:56:22 CST 2013
name=4
这样会把每一次的配置信息都保留下来,其实没有必要保存以往的信息,只要保留最后一条即可,这也就是为什么不采用续写的方式
配置信息的内容可大可小啊,如果是针对手机内存或者一些对内存有限制的设备的话,这些冗余信息会占用一些空间,所以不推荐
QQ251505974

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 很给力!

查看全部评分

回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-11-30 19:21
不是啊,我说的占用空间不是指对象占用
是你采用续写的方式,运行几遍之后,那么配置文件里的内容会是这样 ...

确实如此,毕老师视频提过,你一说我倒想起来了。。。:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马