Записать объекты Java в файл - PullRequest
4 голосов
/ 13 июня 2010

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

Ответы [ 5 ]

13 голосов
/ 13 июня 2010

Вы могли бы

  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(); }
}

Десериализация

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;
    }
}

В и из JSON

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

2 голосов
/ 13 июня 2010

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

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

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

2 голосов
/ 13 июня 2010

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

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

1 голос
/ 13 июня 2010

Если вы хотите записать массивы 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 голос
/ 13 июня 2010

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

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

...