2016-11-29 99 views
0

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

这里是我的代码:

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

使用StandardOpenOption.TRUNCATE_EXISTING代替StandardOpenOption.CREATE

从文档

如果该文件已经存在,它被打开写访问,那么它的长度被截断如果该文件仅用于读取访问权限,则该选项将被忽略。

我改成了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 
+0

您的解决方案解决了问题。但是,我想这可能是一个错误。 – Arashsoft

+0

@Arashsoft即使你在读/写时没有指定任何'StandardOpenOption',它也能正常工作 – Saravana

1

只用你的属性文件运行你的代码。更具体地说:

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

编辑:也许这是一个文件权限或并发问题。 (我是不是能复制这个问题)

+0

这是奇怪!我也使用Oracle JDK8(在Windows 10,64位)。将我的StandardOpenOption更改为'StandardOpenOption.TRUNCATE_EXISTING'解决了我的问题。 – Arashsoft

+0

这让我认为它是文件并发问题。如果你有多个线程写入同一个文件,你可能会遇到这样的问题。 –

+0

我不这么认为,因为我测试它在一个新的项目和新的文件路径,我面临同样的问题。 – Arashsoft