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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 孙传磊 于 2013-3-11 13:38 编辑

/*用于记录应用程序运行次数
* 如果使用次数一到,那么给出注册提示。
* 即使程序结束,该计数器的值也存在。下次程序启动时会先加载计数器的值并加1后重新存储起来。
下面是该实例的代码
  */
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;


public class Jishuqi {

        public static void main(String[] args) throws IOException {
                Properties prop=new Properties();
                File file=new File("C:\\Users\\esws\\Desktop/count.ini");

               
        if(!file.exists()){
                                file.createNewFile();
                       }
        FileInputStream fis=new FileInputStream(file);
                   FileOutputStream fos=new FileOutputStream(file);
               
                prop.load(fis);
                int count=0;
        String value=prop.getProperty("time");  
        if(value!=null){
                count=Integer.parseInt(value);
                if(count>=5){
                        System.out.print("使用次数已到!请注册!");
                        return;
                }}
            count++;
                System.out.print("使用"+count+"次");
                prop.setProperty("time", String.valueOf(count));
                prop.store(fos, value);
                fos.close();
                fis.close();
           }
        }
也是按照视频说的方法写的,为什么运行结果总是:使用1次   而不是不是每次加1直到5次呢?
另一个疑问是,当程序运行的时候发现没有count.ini文件,之后程序创建的文件是空白的,根本没有
"time"键,为什么不要再创建count.ini文件的时候一并写入“time=0”  使文件中有键和值呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 张学林 于 2013-3-10 23:50 编辑

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;


public class Jishuqi {

        public static void main(String[] args) throws IOException {
                Properties prop=new Properties();
                File file=new File("C:/count.ini");

               
        if(!file.exists()){
                                file.createNewFile();
                       }
        FileInputStream fis=new FileInputStream(file);
                   //FileOutputStream fos=new FileOutputStream(file);  确实是这里出的问题,应该把这句移到下面
                prop.load(fis);
                int count=0;
        String value=prop.getProperty("time");  
        if(value!=null){
                count=Integer.parseInt(value);
                if(count>=5){
                        System.out.print("使用次数已到!请注册!");
                        return;
                }}
            count++;
                System.out.print("使用"+count+"次");
                prop.setProperty("time", String.valueOf(count));
            FileOutputStream fos = new FileOutputStream(file);//移到这个位置就好了,因为这句话不管你的文件在不在,它都会新建一个文件,也就是把你的文件覆盖掉,而这前                                                                                      //面 的语句还要用到count.ini里记录的内容如果让在上面的话,它就会一直不能引用之前的内容,因为只要运行这个程序,就
                                                                                            //会覆盖,而放在这里的话,前面的语句已经把count.ini里的内容取走,然后再用.store重新写入,以达到记录的目的
                prop.store(fos, value);
                fos.close();
                fis.close();
           }
        }

点评

如果能多解释一下,效果会更好~  发表于 2013-3-10 23:30

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 付玉光 于 2013-3-11 00:44 编辑

{:soso_e100:}楼主的这个问题,让我来解答一下吧。

首先对楼主的第一个问题《为什么运行结果总是:使用1次而不是不是每次加1直到5次呢?》

产生这个问题的原因是这个构造方法: FileOutputStream(File file) 搞的鬼,

我们查阅API中该构造方法的说明时,会看到这样一句话:

(创建一个新 FileDescriptor 对象来表示此文件连接)也就是说,当我们调用

该构造方法new对象时,它会创建一个新的对象(就是把file这个对象给覆盖了),

我们可以通过以下程序验证。

class PropertiesDemo{
        public static void main(String args[])throws IOException{

                File file = new File("count.ini");
                if(!file.exists()){
                        file.createNewFile();
                }

                FileOutputStream fos = new FileOutputStream(file);

                //往该文件中写入数据。
                fos.write("我是付玉光,希望我的回答能彻底让你明白".getBytes());

                //覆写了原来的文件,打开后它里面没有任何数据。
                FileOutputStream fos1 = new FileOutputStream(file);

                fos.close();
                fos1.close();
        }
}

至于楼主的第二个问题:

《为什么不要再创建count.ini文件的时候一并写入“time=0” 使文件中有键和值呢》

答: 在创建count.ini文件时一并写入“time=0”,是可以的,我就实现了你说的该功能,

但这样做的话,程序中就多了一个FileOutputStream 对象,所以说,

毕老师的做法是最经典的,我们只需照做,哈哈。

以下是我现实了你说的功能。

class Jishuqi1 {

        public static void main(String[] args) throws IOException {
                        Properties prop=new Properties();
                        File file=new File("d:\\count.ini");
                        if(!file.exists()){
                                        file.createNewFile();

                                        //看这里,我是在这里,实现你说的功能的!!!
                                        FileOutputStream fos1=new FileOutputStream(file);
                                        fos1.write("time=0".getBytes());
                        }
                        
                        FileInputStream fis=new FileInputStream(file);
                        int count = 0;
                        prop.load(fis);
                        String value=prop.getProperty("time");  
                        if(value!=null){

                               //看这里我是在这里使count每次都加1 的。
                                count=(Integer.parseInt(value)+1);
                                if(count>=5){
                                        System.out.print("使用次数已到!请注册!");
                                        return;
                                }
                        }
                        System.out.print("使用"+count+"次");
                        prop.setProperty("time", String.valueOf(count));
                        FileOutputStream fos=new FileOutputStream(file);
                        prop.store(fos, value);
                        fos.close();
                        fis.close();
        }
}

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
张学林 发表于 2013-3-10 22:48
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

是的移到这里就解决了!也明白你说的意思!虽然只解决一个问题,不过还是很感谢!这也是习惯把那两句一起写出来的习惯搞的!
回复 使用道具 举报
本帖最后由 孙传磊 于 2013-3-11 11:09 编辑
付玉光 发表于 2013-3-11 00:34
楼主的这个问题,让我来解答一下吧。

首先对楼主的第一个问题《为什么运行结果总是:使用1次 ...

文件里起初是空白的
我在API中查到
“String getProperty(String key)
          用指定的键在此属性列表中搜索属性。 ”
而空白的的文件里并没有键“time”,而  String value=prop.getProperty("time");没有报错,
可以说明如果没有键值,或者是有“键”没有“值”的情况下都返回 null 吗?
如果上面时候的成立,可以说明返回值是String 的都有这种特点?
回复 使用道具 举报
本帖最后由 张学林 于 2013-3-11 12:02 编辑
孙传磊 发表于 2013-3-11 11:07
文件里起初是空白的
我在API中查到
“String getProperty(String key)


键没有值的时候或没有这个键的时候返回的都是null
API中的内容
getProperty
public String getProperty(String key)用指定的键在此属性列表中搜索属性。如果在此属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null。

参数:
key - 属性键。
返回:
属性列表中具有指定键值的值。
另请参见:
setProperty(java.lang.String, java.lang.String), defaults
-----------------------------------------------------------------------华丽的分隔线-------------------------------------------------------------
    public String getProperty(String key) {
Object oval = super.get(key);//这一句是调用父亲HashTable的由键获取值的方法,由于没有这个键,所以oval=null;
String sval = (oval instanceof String) ? (String)oval : null;//这句要判断取没有取到key的值(因为如果key不存在的话就取不到)
return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;//由于defaults一直为null(其他的源码没看,有可能有改动的时候)
                                                                                                                        //所以getProperty总是会返回sval不理解为
                                                                                                                        //啥这样写代码,直接返回一个sval不就行了吗


    }
这个是getProperty的源码
    -----------------------------------------------------------------------华丽的分隔线-------------------------------------------------------------

protected Properties defaults;
       public Properties() {
this(null);
    }

    public Properties(Properties defaults) {
this.defaults = defaults;
    }
    -----------------------------------------------------------------------华丽的分隔线-------------------------------------------------------------
如果上面时候的成立,可以说明返回值是String 的都有这种特点?
自己写个例子,
public static String fanHui(){
         return  "abcd";
}
有点牵强,本意就是说返回什么,由代码里的return语句来决定



评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 付玉光 于 2013-3-11 11:36 编辑
孙传磊 发表于 2013-3-11 11:07
文件里起初是空白的
我在API中查到
“String getProperty(String key)


:)
//①
//第一个问题:getProperty(String key)方法是不会产生错误的,如果有错误产生,

//那么这个方法上就应该有异常的抛出,但是它没有,说明这个方法不会产生异常。
//②
//我们查阅API可查出,(如果在此属性列表中未找到该键,则此方法返回字符串null。

//如果,该键值对中有键,但没有值(或者说值是空白),那么调用这个方法后,

//它什么也不返回(或者说返回空白)

//下面是我的程序代码,你可以验证一下。。

class J1 {
        public static void main(String[] args) throws IOException {

                        Properties prop=new Properties();
                        File file=new File("d:\\count.ini");

                        if(file.exists()){
                                file.delete();
                        }
                        file.createNewFile();
                        FileOutputStream fos1=new FileOutputStream(file);

                        //这是没有键的情况,它返回的是字符串: null            
                       fos1.write("=123".getBytes());

                        FileInputStream in = new FileInputStream(file);
                        prop.load(in);
                        String str = prop.getProperty("time");
                        System.out.println(str);

                }
}

class J2 {
        public static void main(String[] args) throws IOException {

                        Properties prop=new Properties();
                        File file=new File("d:\\count1.ini");
                        if(file.exists()){
                                        file.delete();
                        }
                        file.createNewFile();
                        FileOutputStream fos1=new FileOutputStream(file);

                        //这是没有值的情况,它返回的是空白!                  
                         fos1.write("time=".getBytes());

                        FileInputStream in = new FileInputStream(file);
                        prop.load(in);
                        String str = prop.getProperty("time");
                        System.out.println(str);

                }
}

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马