Загрузите свойства, если они не существуют - создайте их - PullRequest
2 голосов
/ 17 февраля 2012

Я пытаюсь загрузить свойства, и если их не существует, создать их.

хорошо, вот загрузка:

InputStream is  = Store.class.getResourceAsStream("my.properties");
props.load(is);

, но сложная часть состоит в том, чтобы определить, еслифайл не существует и создайте его в случае необходимости

пробовал вот это:

 File conf = null;
 try {
      conf = new File(Store.class.getResource("my.properties").getFile());
 }
 catch (Exception e){
    // can't create file because getResource returns null again
    conf = new File(Store.class.getResource("my.properties").getFile()); //WRONG
    conf.createNewFile();
 }

что я могу сделать в этом случае?

Ответы [ 3 ]

4 голосов
/ 17 февраля 2012

На самом деле, если файл не существует, метод getResource вернет null, поэтому вы получите NullPointerException как внутри блоков try, так и внутри блоков catch.

На самом деле я не знаю, возможно ли в любом случае создать нужный файл, потому что сначала вам нужен полный путь, который вы не можете получить, потому что метод getResource или getResourceAsStream вернет null.

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

final File myfile = new File(new File(BooleanFact.class.getResource("existingfile").getFile()).getParentFile(), "myfile");
myfile.createNewFile();

Но вы должны заметить, что ресурсы проекта фактически не предназначены для создания во время выполнения. Они должны быть добавлены во время разработки и обычно только для чтения (без изменений). Если вам нужно обновить некоторые файлы во время выполнения, вы должны использовать обычную файловую систему.

3 голосов
/ 17 февраля 2012

getResource и getResourceAsStream могут загрузить ресурс из любого места в вашем пути к классам. Вы не должны предполагать, что это даже файл в файловой системе, поскольку он может находиться внутри файла .jar. Поэтому вам не следует пытаться создать файл, если он отсутствует.

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

2 голосов
/ 17 февраля 2012

Мне кажется, проблема в том, что вы загружаете свойства как ресурс, как правило, из пути к классам. Если бы ваше приложение распространялось в виде jar-файла, что бы вы хотели сделать? Где бы вы хотели создать файл?

Так что, возможно, вы могли бы сделать это:

  • Если файл существует в пути к классам, тогда загружайте его в качестве ресурса (это имеет смысл, только если ваш файл jar или другой файл пути к классам содержит файл свойств)
  • Если он не существует, вам придется выбрать папку (что-то внутри «домашней папки» пользователя?), А затем посмотреть, существует ли файл там
  • Если файл существует, вы можете загрузить свойства, используя FileInputStream, а не из Resource
  • Если файл не существует, вы можете создать его самостоятельно и записать значения по умолчанию для свойств.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...