как записать в текстовый файл на Java - PullRequest
1 голос
/ 14 марта 2011

Я делаю проект в Java, и мне нужно добавить и изменить мой текстовый файл во время выполнения, сгруппированный в jar.

Я использую class.getResourceAsStream (имя файла), этот метод мы может прочитать этот файл из пути к классам.

Я хочу записать в тот же текстовый файл.

Какое возможное решение для этого. Если я не могу обновить текстовый файл в банке, какое еще есть решение? Цени любую помощь.

Ответы [ 5 ]

3 голосов
/ 14 марта 2011

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

Существует простое решение, которое позволяет вам распространять только файл jar. При запуске попытайтесь прочитать файл из файловой системы. Если вы не нашли его, используйте значения по умолчанию, которые закодированы в вашей программе. Затем, когда внесены изменения, вы можете записать их в файловую систему.

2 голосов
/ 14 марта 2011

Как правило, вы не можете обновить файл, который вы нашли, используя getResourceAsStream. Это может быть файл в файле JAR / ZIP ... и его запись повлечет за собой переписывание всего файла JAR. Это может быть удаленный файл, обслуживаемый загрузчиком классов Url.

Для вашего здравого смысла (и хорошей практики) вы не должны пытаться обновить файлы, к которым вы обращаетесь через classpath. Если вам нужно, прочитайте файл из файла JAR (или любого другого), скопируйте его в обычную файловую систему и обновите копию.


Я не говорю, что невозможно сделать это во всех случаях. Действительно, в большинстве нормальных случаев вы можете сделать это с некоторым усилием. Однако это не поддерживается, и для этого нет стандартных API.

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

Наконец, есть случаи, когда обновление ресурса невозможно :

  • Когда у пользователя нет прав на запись в каталог установки приложения. Это типично для правильно администрируемой машины UNIX / Linux.

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

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

1 голос
/ 14 марта 2011

Хорошим решением, позволяющим избежать необходимости помещать ваши элементы в файл Jar, является чтение (если имеется) файла свойств из скрытого подкаталога в домашнем каталоге пользователя.Логика выглядит примерно так:

if (the hidden directory named after my application doesn't exist) {
  makeTheHiddenDirectory();
  writeTheDefaultPropertiesFile();
}
Properties appProps = new Properties();
appProps.load(new FileInputStream(fileInHiddenDir));
...
... After the appProps have changed ...
...
appProps.store(new FileOutputStream(fileInHiddenDir), "Do not modify this file");

Посмотрите на java.util.Properties и имейте в виду, что они имеют два разных формата загрузки и хранения (ключ = значение на основе и XML).Выберите тот, который подходит вам лучше всего.

1 голос
/ 14 марта 2011

Все методы перезаписи JAR в Java выглядят одинаково.Откройте файл Jar, прочитайте все его содержимое и напишите новый файл Jar, содержащий немодифицированное содержимое (и изменения, которые вы хотели внести).Такие методы не рекомендуются для файла Jar в пути к классу, тем более, из файла Jar, из которого вы запускаете.

Если вы решите, что должны делать это таким образом, в Java World есть несколько статей:

Изменение архивов, часть 1

Изменение архивов, часть 2

1 голос
/ 14 марта 2011

Если я не могу обновить текстовый файл в jar, какое еще решение есть?

Храните информацию в любом из:

  1. Печенье
  2. Сервер
  3. Разверните апплет с помощью 1.6.0_10 +, запустите его с помощью JWS и используйте PersistenceService для хранения информации. Вот мое демо. PersistenceService.

Кроме того, если ваши пользователи согласятся на доверенный апплет (что кажется излишним для этого), вы можете записать информацию в подкаталог user.home.

...