一个简单的属性练习#java

时间:2018-08-22 19:04:35

标签: java properties

我有一个简单的“属性”练习
1.从配置文档ProgramRunCounter.ini中读取程序运行的时间
2.程序每次运行,都要再增加一次
3.修改文档中的信息

代码如下:

class ProgramRunCounter {

public static void counter() throws IOException{        
    Properties prop = new Properties();
    File f = new File("ProgramRunCounter.ini");
    BufferedReader br;
    BufferedWriter bw;

    String key = "times";
    String value;
    int counter;

    if (!f.exists()) {
        f.createNewFile();
        System.out.println("File created");
    }

    //Problem is here
    br = new BufferedReader(new FileReader(f));
    prop.load(br);
    value = prop.getProperty(key);      
    bw = new BufferedWriter(new FileWriter(f));
    if (value != null) {
        counter = Integer.parseInt(value);
        System.out.println("This program has run " + counter + " times");
        counter++;
        value = String.valueOf(counter);
        prop.setProperty(key, value);
        prop.store(bw, "One more time run!");
    } else {
        prop.setProperty(key, "1");
        prop.store(bw, "First time run!");
    }

    br.close();
    bw.close();
}

}

public class PropertiesDemo {

    public static void main(String[] args) {
        try {
            ProgramRunCounter.counter();
        } catch (IOException e) {
            throw new RuntimeException(e.toString());
        }
    }

}

它工作正常,但是问题是,如果我改变这样的代码顺序,就无法工作了

br = new BufferedReader(new FileReader(f));
bw = new BufferedWriter(new FileWriter(f));
prop.load(br);
value = prop.getProperty(key);

那为什么呢?
不允许在bw = new BufferedWriter(new FileWriter(f));br = new BufferedReader(new FileReader(f));之间插入prop.load(br);吗?
原理是什么?

1 个答案:

答案 0 :(得分:0)

细节决定成败。首先,我只想说一句,您可能只想使用IO文件API(即Files.newBufferedReader / Files.newBufferedWriter(f.toPath(),...)。不是必须的,但是它使事情变得容易。

如果您查看newBufferedWriter的Javadoc,则会看到以下内容:

  

打开或创建一个用于写入的文件,返回一个BufferedWriter,该缓冲区可用于以有效方式将文本写入该文件。 options参数指定如何创建或打开文件。如果没有选项,则此方法就像存在CREATETRUNCATE_EXISTINGWRITE选项一样工作。换句话说,它将打开要写入的文件,如果不存在则创建文件,或者如果存在的话regular-file最初将其截断为0。

这种效率可能是为什么您在读取文件时不再看到任何内容的原因(在这里我假设如果您只是使用自己的BufferedWriter实例化,那么也会应用相同的效率。与FileWriter一起使用,而FileOutputStreamappend=false一起使用Files.newBufferedWriter。如果您跟踪所有调用,则最终会以本机方法结束,因此很遗憾,我不确定。

现在,如果您使用OpenOption,而只是将TRUNCATE_EXISTING改为SYNCbr = Files.newBufferedReader(f.toPath()); bw = Files.newBufferedWriter(f.toPath(), StandardOpenOption.SYNC); 之外的其他内容,那么读者将能够再次加载属性,而无论哪个初始化先出现,例如

delete