我读了一个属性文件,用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
答案 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