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

От 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 
+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 бит). изменение моего стандартаOpenOption на 'StandardOpenOption.TRUNCATE_EXISTING 'разрешило проблему для меня. – Arashsoft

+0

Это заставляет меня думать, что это проблема параллелизма файлов. Если у вас есть несколько потоков, пишущих один файл, у вас могут быть такие проблемы. –

+0

Я так не думаю, потому что я тестирую его в новом проекте и новом пути к файлу, и я столкнулся с той же проблемой. – Arashsoft

Смежные вопросы