我有一个简单的“属性”练习
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);
吗?
原理是什么?
答案 0 :(得分:0)
细节决定成败。首先,我只想说一句,您可能只想使用IO文件API(即Files.newBufferedReader
/ Files.newBufferedWriter(f.toPath()
,...)。不是必须的,但是它使事情变得容易。
如果您查看newBufferedWriter
的Javadoc,则会看到以下内容:
打开或创建一个用于写入的文件,返回一个BufferedWriter,该缓冲区可用于以有效方式将文本写入该文件。 options参数指定如何创建或打开文件。如果没有选项,则此方法就像存在CREATE,TRUNCATE_EXISTING和WRITE选项一样工作。换句话说,它将打开要写入的文件,如果不存在则创建文件,或者如果存在的话regular-file最初将其截断为0。
这种效率可能是为什么您在读取文件时不再看到任何内容的原因(在这里我假设如果您只是使用自己的BufferedWriter
实例化,那么也会应用相同的效率。与FileWriter
一起使用,而FileOutputStream
与append=false
一起使用Files.newBufferedWriter
。如果您跟踪所有调用,则最终会以本机方法结束,因此很遗憾,我不确定。
现在,如果您使用OpenOption
,而只是将TRUNCATE_EXISTING
改为SYNC
或br = Files.newBufferedReader(f.toPath());
bw = Files.newBufferedWriter(f.toPath(), StandardOpenOption.SYNC);
之外的其他内容,那么读者将能够再次加载属性,而无论哪个初始化先出现,例如
delete