我有一个名为config.txt的配置文件,看起来像这样。
IP=192.168.1.145
PORT=10022
URL=http://www.stackoverflow.com
我想在Java中更改配置文件的某些值,比如将端口改为10045.我怎样才能轻松实现?
IP=192.168.1.145
PORT=10045
URL=http://www.stackoverflow.com
在我的试用中,我需要编写大量代码来读取每一行,找到PORT,删除原始的10022,然后重写10045.我的代码是虚拟的,难以阅读。 java中有没有方便的方法?
非常感谢!
答案 0 :(得分:5)
如果你想要一些简短的东西,你可以使用它。
public static void changeProperty(String filename, String key, String value) throws IOException {
Properties prop =new Properties();
prop.load(new FileInputStream(filename));
prop.setProperty(key, value);
prop.store(new FileOutputStream(filename),null);
}
不幸的是,它不保留订单或字段或任何评论。
如果你想保留订单,一次读一行也不是那么糟糕。
这个未经测试的代码会保留注释,空行和顺序。它不会处理多行值。
public static void changeProperty(String filename, String key, String value) throws IOException {
final File tmpFile = new File(filename + ".tmp");
final File file = new File(filename);
PrintWriter pw = new PrintWriter(tmpFile);
BufferedReader br = new BufferedReader(new FileReader(file));
boolean found = false;
final String toAdd = key + '=' + value;
for (String line; (line = br.readLine()) != null; ) {
if (line.startsWith(key + '=')) {
line = toAdd;
found = true;
}
pw.println(line);
}
if (!found)
pw.println(toAdd);
br.close();
pw.close();
tmpFile.renameTo(file);
}
答案 1 :(得分:1)
我的建议是将整个配置文件读入内存(可能放入(属性:值)对象列表中),执行您需要做的任何处理(并因此进行任何更改),然后覆盖原始文件你做了所有的改变。
例如,您可以读取您按行提供的配置文件,使用String.split("=")
分隔属性:值对 - 确保相应地命名每对读取。然后进行您需要的任何更改,迭代您已读入的对(并可能已修改),将它们写回文件。
当然,如果您的配置文件中的行数相对较少,这种方法最有效,您绝对可以知道格式。
答案 2 :(得分:0)
使用Properties类加载/保存配置。然后只需设置值并再次保存。
Properties p = new Properties();
p.load(...);
p.put("key", "value");
p.save(...)
这很简单直接。
作为一方,如果您的应用程序是一个不需要扩展以在多台计算机上运行的应用程序,请不要费心使用数据库来保存配置。这完全是矫枉过正。但是,如果您的应用程序需要实时配置更改并需要扩展,Redis 可以很好地分配配置并为您处理同步。我已经将它用于此目的并取得了巨大的成功。
答案 3 :(得分:0)
考虑使用java.util.Properties及其load()和store()方法。 但请记住,这不会保留文件中的注释和额外的换行符。 某些字符也需要转义。
答案 4 :(得分:0)
如果您愿意使用第三方库,请浏览http://commons.apache.org/configuration/。它支持多种格式的配置。评论也将保留。 (除了小错误 - apache-commons-config PropertiesConfiguration: comments after last property is lost)