2013-03-29 1 views
5

Я хочу сериализовать некоторые объекты в своем Java-коде. Я не хочу помещать его в какую-то случайную папку на жестком диске. Я хочу, чтобы он находился внутри A FOLDER в моей папке проекта eclipse. Как создать эту папку и сохранить в ней мои объекты?Как создать папку в eclipse для хранения сериализованных объектов?

Это хорошая практика? Будет ли проблема, если я попытаюсь сделать автономный JAR из этого проекта?

ответ

6

Ниже исходный код показывает, как создать вложенную папку в текущей директории:

import java.io.File; 

public class SourceCodeProgram { 

    public static void main(String argv[]) throws Exception { 
     File currentFolder = new File("."); 
     File workingFolder = new File(currentFolder, "serialized"); 
     if (!workingFolder.exists()) { 
      workingFolder.mkdir(); 
     } 
     System.out.println(workingFolder.getAbsolutePath()); 
    } 
} 

При запуске этого исходного кода и обновить проект Eclipse, вы должны увидеть serialized каталог в структуре проекта Eclipse. Теперь вы можете использовать его и хранить в нем все файлы.

В моем приложении, когда я хочу хранить некоторые данные на жестком диске, я всегда пользуюсь рекомендациями пользователей. Я создаю application.properties файл, который содержит ключ:

working.folder=/example/app-name 

App считывает этот файл на старте и создает эту папку, если она нужна. Второе решение может быть «параметром приложения». Когда мне нужно только один или два параметра от пользователей, я прочитал его из командной строки. Например, пользователь запустить мое приложение с помощью этой команды:

java -jar app.jar -dir /example/app-name 

Когда пользователь не предоставляет любую папку я использую по умолчанию папки - текущего каталога.

полезные ссылки:

+1

+1 для полного ответа с рабочим кодом. –

3

Это зависит от информации, которую имеют эти сериализуемые объекты.

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

URL dir_url = ClassLoader.getSystemResource(dir_path); 
// Turn the resource into a File object 
File dir = new File(dir_url.toURI()); 
// List the directory 
String files = dir.list() 

каталог Примечание должен быть в пути к классам.

+0

, как вы это делаете в упадке? Это создать папку внутри вашего проекта java, а затем включить ваш код для записи и чтения из этой папки? –

+1

Я предполагаю, что вы знаете об этом, любая папка, которую вы создаете внутри eclipse, на самом деле будет папкой в ​​папке-системе. –

+0

Итак, скажите, что ваш проект является ProjA, ваш источник находится в ProjA/src ... Создайте папку в ProjA/res из проводника и обновите в eclipse, и вы увидите папку там. (Здесь вы можете сохранить свои сериализованные объекты.) –

2

Не лучше ли вам писать в каталог пользователя, например. в подпапках, таких как .myApp/?

Вы хотите сделать что-то вроде этого, чтобы создать/инициализировать каталог:

File userDir = new File(System.getProperty("user.home")); 
File storageDir = new File(userDir, ".myApp"); 
if (!storageDir.exists()) 
    storageDir.mkdir(); 
// store your file in storageDir 

Посмотрите here, чтобы узнать, где userDir обычно находится (хотя не обязательно должны заботиться).

+0

Как вы это делаете? Мне нужны шаги. –

3

Шаги:

  1. Щелкните правой кнопкой мыши папку вашего проекта в проводнике пакетов
  2. Найдите пункт меню «Создать» и наведите его
  3. Расположить «Папка» в открываемый и нажмите на него
  4. Дайте вашей папке имя
  5. Нажмите Кнопка «Готово» внизу

Это создаст папку, которая должна быть доступна из вашего рабочего каталога при запуске из eclipse.

Плохая идея возиться с файлами, находящимися в файле JAR во время выполнения. Представьте себе сценарий, когда есть два или несколько JVM, работающих с одним JAR, это также означает, что они работают с одними и теми же файлами, и чтение/запись в эти файлы может привести к столкновениям. Обычно вы хотели бы отделить эти файлы друг от друга.

Так что, если эти файлы не только для чтения, вы не должны включать их в JAR (в противном случае штраф)

+0

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

0

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

Затем обновите представление проводника проекта в Eclipse, и вуаля, каталог и файлы являются частью представления.

2

Если вы запустите свою программу в Eclipse, то по умолчанию текущий рабочий каталог процесса будет корневым каталогом проекта. Затем вы можете инициализировать и использовать каталог с именем serialized в корне вашего проекта, как это:

File serializedDir = new File("serialized"); 
if (!serializedDir.exists()) { 
    serializedDir.mkdir(); 
} 

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

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

При использовании функции экспорта Eclipse для создания баночки из проекта имейте в виду, что папка будет выбрана по умолчанию. Вы должны явно отменить его, чтобы исключить из банки. (В любом случае лучше использовать Maven или Ant для создания баннеров вместо Eclipse, которые вам нужно настроить только один раз, поэтому вам не нужно беспокоиться о том, что каталог попадает случайно.)

Возможно, вы также захотите исключить каталог из контроля версий.

2

Для этого вам понадобятся две вещи: A) Доступ/создание определенной папки B) На самом деле сериализуйте свои объекты и сохраните их на диск.

Для A) на это, безусловно, отвечают другие ответы здесь, которые показывают, как: 1) Проверьте, существует ли папка. 2) Создайте папку, если она не существует. Кроме того, проекты, запущенные в eclipse, имеют в качестве рабочего каталога папку проекта eclipse.

Для B) вам необходимо сериализовать объекты с помощью FileOutputStream. См. http://www.tutorialspoint.com/java/java_serialization.htm. Вы можете сериализовать каждый объект в отдельный файл или создать один класс с ArrayList (или некоторой другой структурой данных), содержащий ссылки на все объекты.

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

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.util.ArrayList; 


public class CreateDirAndSerialize { 


    public static void main(String args[]) 
    { 
     ArrayList<String> sampleString = new ArrayList<String>(); 
     sampleString.add("Test1"); 
     sampleString.add("Test2"); 
     sampleString.add("Test2"); 
     //Get the directory 
     File directory = getSerializedDirectory(); 
     writeObjects(directory, sampleString); 
    } 

    public static void writeObjects(File directory, Object object) 
    { 
     try 
      { 
      FileOutputStream fileOut = 
      new FileOutputStream(directory+"//serializedData"); 
      ObjectOutputStream out = 
           new ObjectOutputStream(fileOut); 
      out.writeObject(object); 
      out.close(); 
       fileOut.close(); 
      }catch(IOException i) 
      { 
       i.printStackTrace(); 
      } 
    } 

    public static File getSerializedDirectory() 
    { 
     File serializedDir = new File("serialized"); 
     if (!serializedDir.exists()) { 
      serializedDir.mkdir(); 
     } 
     return serializedDir; 
    } 

} 

Поскольку вопрос упомянутых проектов в затмении, выше для кода в проекте Eclipse. Если вы хотите взаимодействовать с самим Eclipse, мы говорим о разработке плагина eclipse, который является еще одной историей, поэтому вам нужно указать это.

Наконец, вы также можете создать собственный класс, содержащий любые переменные, которые вы хотите, и создать экземпляр объекта singleton для размещения всех ваших других объектов. Однако существуют некоторые ограничения при сериализации объектов, например. : - Ссылки на объекты со статическим модификатором не являются сериализуемыми.

Смотрите это для некоторых правил/советов для некоторых сериализации: http://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208

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