Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何在Java中轻松更改配置文件值?_Java_Configuration - Fatal编程技术网

Java:如何在Java中轻松更改配置文件值?

Java:如何在Java中轻松更改配置文件值?,java,configuration,Java,Configuration,我有一个配置文件,名为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 在我的试用版中,我需要编写大量代码来读取每一行,找到端口,删除原来的10022,然后重写10045。我的代码

我有一个配置文件,名为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
在我的试用版中,我需要编写大量代码来读取每一行,找到端口,删除原来的10022,然后重写10045。我的代码是假的,很难读。java有什么方便的方法吗


非常感谢

我的建议是将整个配置文件读入内存(可能读入(attribute:value)对对象的列表),执行您需要执行的任何处理(并因此进行任何更改),然后用您所做的所有更改覆盖原始文件

例如,您可以读取第行提供的配置文件,使用
String.split(“=”)
分隔属性:值对-确保相应地命名每个读取的对。然后进行所需的任何更改,迭代已读入(可能已修改)的对,将它们写回文件


当然,如果您的配置文件中的行数相对较少,并且您完全可以知道其格式,那么这种方法将最为有效。

我的建议是将整个配置文件读入内存(可能读入(属性:值)对对象的列表),执行您需要执行的任何处理(并因此进行任何更改),然后用您所做的所有更改覆盖原始文件

例如,您可以读取第行提供的配置文件,使用
String.split(“=”)
分隔属性:值对-确保对读取的每一对进行相应的命名。然后进行所需的任何更改,对已读入(可能已修改)的对进行迭代,将它们写回文件


当然,如果您的配置文件中的行数相对较少,并且您完全可以知道其格式,则此方法最为有效。

使用Properties类加载/保存配置。然后只需设置值并再次保存即可

Properties p = new Properties();
p.load(...);
p.put("key", "value");
p.save(...)
这很简单,也很直接


另一方面,如果您的应用程序是一个不需要扩展以在多台计算机上运行的单个应用程序,则不必费心使用数据库来保存配置。这完全是多余的。但是,如果您的应用程序需要实时配置更改并需要扩展,则可以很好地分发配置并为您处理同步。I您已经成功地将其用于此目的。

使用Properties类加载/保存配置。然后只需设置值并再次保存即可

Properties p = new Properties();
p.load(...);
p.put("key", "value");
p.save(...)
这很简单,也很直接


另一方面,如果您的应用程序是一个不需要扩展以在多台计算机上运行的单个应用程序,则不必费心使用数据库来保存配置。这完全是多余的。但是,如果您的应用程序需要实时配置更改并需要扩展,则可以很好地分发配置并为您处理同步。I您已经成功地将其用于此目的。

如果您想要简短的内容,可以使用此功能

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);
}

如果你想要短的,你可以用这个

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);
}
考虑使用及其load()和store()方法。 但请记住,这不会在文件中保留注释和额外的换行符。 还需要转义某些字符。

考虑使用及其load()和store()方法。 但请记住,这不会在文件中保留注释和额外的换行符。

还需要转义某些字符。

如果您愿意使用第三方库,请浏览。它支持多种格式的配置。注释也将保留。(除了一个小错误--)

如果您愿意使用第三方库,请浏览。它支持多种格式的配置。注释也将保留。(除了一个小错误--)

文件是此配置必须的吗?数据库如何?既然您必须读取文件,为什么不逐行读取文件并继续将该行写入新文件。当端口到来时,您知道要写入更改的值。是的,这让我非常沮丧。@Zohaib:不太明白,您能描述更多吗?文件是此配置必须的吗?数据库怎么样?既然你必须读取文件,为什么不逐行读取文件并继续将该行写入新文件。当端口到来时,你知道如何写入更改后的值。是的,这让我很沮丧。@Zohaib:不太明白,你能描述更多吗?我可以在哪里加载目标文件?属性文件是个好主意。但是,OP没有说它是一个属性文件作为配置,而是一个文本文件。它可以是ip=xx port=xx url=xx。现在我们想更改ip=x.y.z.n的端口号。因此文件中的密钥可能不是唯一的。我会将该文件放在与类相同的包(目录)中,然后简单地执行:P.load(MyConfigReaderClass.class.getResourceAsStream(“myconfig.txt”));但请注意,这不会保留行的原始顺序(不知道这是否重要)在哪里可以加载我的目标文件?属性文件是个好主意。但是,OP没有说它是配置的属性文件,而是一个文本文件。它可以是ip=xx端口=xx url=xx。现在我们想更改ip=x.y.z.n的端口号。因此文件中的密钥可能不是唯一的。我会将该文件放在同一个包(目录)中作为类,然后只需执行:p.load(MyConfigReaderClass.class.getResourceAsStre