无法从java属性文件中删除密钥

时间:2016-11-29 16:51:42

标签: java properties outputstream

我读了一个属性文件,用remove()从中删除了一个键,一切都很好,直到这一步。但是,当我尝试使用store()将属性保存到文件中时。它不会从属性文件中删除密钥。

这是我的代码:

Properties props = new Properties();
try (InputStream in = Files.newInputStream(Paths.get("/myFolder/myFile.properties"))){
    props.load(in);
}catch(NoSuchFileException e){
    // file not found, continue with empty Properties
}
props.remove("someKeyToDelete");

try (OutputStream out = Files.newOutputStream(Paths.get("/myFolder/myFile.properties"), StandardOpenOption.CREATE)){
    props.store(out, null);
}

这是在myFile.properties中:

someKeyToDelete=123

此外,如果我使用此文件运行代码:

key1.abc=abc
someKeyToDelete=123
key1.abc2=abc2

我得到了这个结果!!:

key1.abc=abc
key1.abc2=abc2
123
key1.abc2=abc2

2 个答案:

答案 0 :(得分:2)

只需使用属性文件运行代码即可。更具体地说:

import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Properties;

public class Main {
    public static void main(String ... args) throws Exception {
        Properties props = new Properties();
        try (InputStream in = Files.newInputStream(Paths.get("myFile.properties"))){
            props.load(in);
        }catch(NoSuchFileException e){
            // file not found, continue with empty Properties
        }
        props.remove("someKeyToDelete");

        try (OutputStream out = Files.newOutputStream(Paths.get("myFile.properties"), StandardOpenOption.CREATE)){
            props.store(out, null);
        }
    }
}

......它完全符合预期,没有任何问题。 注意:使用Oracle JDK 8

编辑:可能是文件权限或并发问题。 (我无法复制问题)

答案 1 :(得分:2)

使用StandardOpenOption.TRUNCATE_EXISTING代替StandardOpenOption.CREATE

来自docs

  

如果该文件已存在并且已打开以进行WRITE访问,则其长度将被截断为0.如果仅为READ访问打开该文件,则忽略此选项。

我将其更改为TRUNCATE_EXISTING

    try (OutputStream out = Files.newOutputStream(Paths.get("props2.properties"), StandardOpenOption.TRUNCATE_EXISTING)) {
        props.store(out, null);
    }

它按预期创建了属性文件

#Tue Nov 29 22:39:04 IST 2016
key1.abc=abc
key1.abc2=abc2

在Ubuntu + Java8上尝试过它,它起作用了

Linux ubuntu 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux