JAVA: FileInputStream и FileOutputStream

У меня есть эта странная вещь с входными и выходными потоками, которую я просто не могу понять. Я использую inputstream для чтения файла свойств из таких ресурсов:

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream( "/resources/SQL.properties" );
rop.load(in);
return prop;

Он находит мой файл и успешно красит его. Я пытаюсь написать измененные настройки следующим образом:

prop.store(new FileOutputStream( "/resources/SQL.properties" ), null);

И я получаю странную ошибку при сохранении:

java.io.FileNotFoundException: \resources\SQL.properties (The system cannot find the path specified)

Итак, почему путь к свойствам изменен? Как это исправить? Я использую Netbeans в Windows


person gedO    schedule 08.05.2012    source источник
comment
Добро пожаловать в СО. +1 за хорошо сформулированный вопрос со всей необходимой информацией.   -  person Jim Garrison    schedule 08.05.2012


Ответы (3)


Может быть, это работает

try
{
java.net.URL url = this.getClass().getResource("/resources/SQL.properties");

java.io.FileInputStream pin = new java.io.FileInputStream(url.getFile());

java.util.Properties props = new java.util.Properties();

props.load(pin);
}
catch(Exception ex)
{
ex.printStackTrace();
}

и проверьте приведенный ниже URL

getResourceAsStream() и FileInputStream

person user1357722    schedule 08.05.2012

Проблема в том, что getResourceAsStream() разрешает указанный вами путь относительно пути к классам, а new FileOutputStream() создает файл непосредственно в файловой системе. У них разные стартовые точки пути.

Как правило, вы не можете выполнить обратную запись в исходное местоположение, из которого был загружен ресурс, так как он может вообще не существовать в файловой системе. Например, это может быть файл jar, и JVM не будет обновлять файл jar.

person Jim Garrison    schedule 08.05.2012
comment
Не могли бы вы дать мне пример, как написать это правильно? - person gedO; 08.05.2012
comment
Вы не можете написать это правильно. В общем случае вы не можете писать в место, откуда был загружен ресурс. Он может не существовать в доступном для записи месте. - person Jim Garrison; 08.05.2012

См. этот вопрос: Как я могу сохранить файл в пути к классу

И этот ответ https://stackoverflow.com/a/4714719/239168

В итоге: вы не всегда можете тривиально сохранить файл, прочитанный вами из пути к классам (например, файл в банке)

Однако, если это действительно был просто файл в пути к классам, приведенный выше ответ имеет хороший подход.

person Eran Medan    schedule 08.05.2012