Вопрос: Запись объектов Java в файл


Можно ли записывать объекты в Java в двоичный файл? Объектами, которые я хочу написать, будет 2 массива String объекты. Причина, по которой я хочу это сделать, - сохранить постоянные данные. Если есть более простой способ сделать это, дайте мне знать.


4


источник


Ответы:


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

Вы также можете обнаружить, что простой текстовый формат будет быстрее и компактнее, чем использование XML или JSON. Примечание. Эти форматы более полезны для сложных структур данных.

public static void writeArray(PrintStream ps, String... strings) {
    for (String string : strings) {
        assert !string.contains("\n") && string.length()>0;
        ps.println(strings);
    }
    ps.println();
}

public static String[] readArray(BufferedReader br) throws IOException {
    List<String> strings = new ArrayList<String>();
    String string;
    while((string = br.readLine()) != null) {
        if (string.length() == 0)
            break;
        strings.add(string);
    }
    return strings.toArray(new String[strings.size()]);
}

Если вы начинаете с

String[][] theData = { { "a0 r0", "a0 r1", "a0 r2" } {"r1 c1"} }; 

Это может привести к

a0 r0
a0 r1
a0 r2

r1 c1

Как вы можете видеть, это легко редактировать / просматривать.

Это делает некоторые предположения о том, что может содержать строка (см. Актив). Если эти допущения недействительны, есть способ обойти это.


1



Ты мог

  1. Сериализовать массивы или класс который содержит массивы.
  2. Напишите массивы как две строки в отформатированном     путь, такой как JSON, XML или CSV.

Вот код для первого (вы можете заменить очередь на массив) Сериализация  

public static void main(String args[]) {
  String[][] theData = new String[2][1];

  theData[0][0] = ("r0 c1");
  theData[1][0] = ("r1 c1");
  System.out.println(theData.toString());

  // serialize the Queue
  System.out.println("serializing theData");
  try {
      FileOutputStream fout = new FileOutputStream("thedata.dat");
      ObjectOutputStream oos = new ObjectOutputStream(fout);
      oos.writeObject(theData);
      oos.close();
      }
   catch (Exception e) { e.printStackTrace(); }
}

Deserialize  

public static void main(String args[]) {
   String[][] theData;

   // unserialize the Queue
   System.out.println("unserializing theQueue");
   try {
    FileInputStream fin = new FileInputStream("thedata.dat");
    ObjectInputStream ois = new ObjectInputStream(fin);
    theData = (Queue) ois.readObject();
    ois.close();
    }
   catch (Exception e) { e.printStackTrace(); }

   System.out.println(theData.toString());     
}

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

Чтение и запись в формате XML

import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import java.io.*;

public class XMLSerializer {
    public static void write(String[][] f, String filename) throws Exception{
        XMLEncoder encoder =
           new XMLEncoder(
              new BufferedOutputStream(
                new FileOutputStream(filename)));
        encoder.writeObject(f);
        encoder.close();
    }

    public static String[][] read(String filename) throws Exception {
        XMLDecoder decoder =
            new XMLDecoder(new BufferedInputStream(
                new FileInputStream(filename)));
        String[][] o = (String[][])decoder.readObject();
        decoder.close();
        return o;
    }
}

To и From JSON

У Google есть хорошая библиотека для конвертации в JSON и обратно http://code.google.com/p/google-gson/   Вы можете просто написать свой объект в JSOn, а затем записать его в файл. Чтобы читать делайте наоборот.


13



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

Для долговременного хранения вы должны использовать стандартный и хорошо документированный формат (например, XML, JSON или что-то еще), которое не тесно связано с вашим кодом Java.

Если по какой-то причине вы абсолютно хотите использовать двоичный формат, тогда есть несколько доступных вариантов, например Буферы протокола Google  или гессенский ,


2



Одной из возможностей, помимо сериализации, является запись объектов в файлы XML, чтобы сделать их более удобочитаемыми. XStream API способен на это и использует подход, похожий на сериализацию.

http://x-stream.github.io/


2



Вам нужно написать объект, а не класс, правильно? Поскольку классы уже скомпилированы в двоичные файлы .class.

Попробуйте ObjectOutputStream, есть пример
http://java.sun.com/javase/6/docs/api/java/io/ObjectOutputStream.html


1