2016-11-29 44 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