0

我有一个用 Java 编写的程序,读取两个属性文件 - source.properties 和destination.properties 并写入从源到目标的每一行的键/值对。我决定使用来自 apache commons io api 的 FileUtils.writeStringToFile 方法,而不是来自 java 标准 api 的 PrintWriter 或 FileWriter。我发现只有源文件中的最后一行被覆盖到目标文件。

source.properties 的内容
username=a
host=abc

destination.properties 的内容
host=abc

  static void writeToFile(Map<String,String> map, String pathToFile)    {                                 
    Iterator<Map.Entry<String,String>> itr = map.entrySet().iterator();
    File path = new File(pathToFile);
    while(itr.hasNext())    {
        Map.Entry<String,String> pairs = (Map.Entry<String,String>)itr.next();
        FileUtils.writeStringToFile(path,pairs.getKey() + "=" + pairs.getValue());
    }
}

map 包含来自源文件的键/值对。当我调试程序时,我能够看到 while 循环经过两次,并且 map 包含所有正确的数据,并且 FileUtils 中的方法被调用了两次,并从源文件中写入了每一行数据。

有人可以向我解释为什么我会得到上述输出吗?

[更新]
我能够使用 PrintWriter 实现我想要的。

4

1 回答 1

3

您必须使用FileUtils#writeStringToFile设置为的布尔参数true来告诉 utils 方法它应该将 附加String到文件末尾而不是覆盖它。

@Deprecated
public static void writeStringToFile(File file,
                            String data,
                            boolean append)
                          throws IOException

所以你的代码应该如下:

static void writeToFile(Map<String,String> map, String pathToFile)
{                                 
  Iterator<Map.Entry<String,String>> itr = map.entrySet().iterator();
  File path = new File(pathToFile);
  while(itr.hasNext())    {
    Map.Entry<String,String> pairs = (Map.Entry<String,String>)itr.next();
    FileUtils.writeStringToFile(path,
      pairs.getKey() + "=" + pairs.getValue(), 
      true);// append rather than overwrite
  }
}

旁注:此方法已弃用,您应该使用Charset方法签名中指定的方法。

于 2014-05-23T13:51:17.870 回答