Java: запись/чтение карты с диска

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

Моя структура - HashMap<String, Object>. Объект довольно прост; Для переменных-членов он имеет String и два небольших нативных массива типа Boolean. Это действительно простое приложение, и я бы не ожидал, что за один раз будет больше 10-15 пар <key,value>.

Я экспериментировал (безуспешно) с потоками ввода/вывода объекта. Нужно ли сделать класс Object сериализуемым?

Можете ли вы дать мне какие-либо предложения о том, как это сделать? Мне просто нужно подтолкнуть в правильном направлении. Спасибо!

РЕДАКТИРОВАТЬ: Ну, я чувствую себя еще глупо, я писал с одной карты и читал в другую карту, а затем сравнивал их, чтобы проверить свои результаты. Видимо, я сравнивал их неправильно. Вздох.

Ответ 1

Если вас не интересует объект, вам просто нужна пара значений ключей String, String, тогда я предлагаю вам перейти на java.util.Properties. иначе вы идете

        Map map = new HashMap();
        map.put("1",new Integer(1));
        map.put("2",new Integer(2));
        map.put("3",new Integer(3));
        FileOutputStream fos = new FileOutputStream("map.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(map);
        oos.close();

        FileInputStream fis = new FileInputStream("map.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Map anotherMap = (Map) ois.readObject();
        ois.close();

        System.out.println(anotherMap);

Ответ 2

Map m = new HashMap();
// let use untyped and autoboxing just for example
m.put("One",1);
m.put("Two",2);

ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("foo.ser")
);
oos.writeObject(m);
oos.flush();
oos.close();

Ответ 3

Да, вашим объектам потребуется реализовать Serializable для сериализации по механизму Java по умолчанию. HashMap и String уже реализуют этот интерфейс и, следовательно, могут быть успешно сериализованы.

Взгляните на Sun Учебник по сериализации - он довольно короткий, и я думаю, что он должен охватывать все, что вам нужно для вашего простого случая. (Вы должны просто иметь возможность сериализовать объект Map в поток, а затем читать его обратно при последующих запусках).

Если вы столкнулись с проблемами, попробуйте выполнить сериализацию простого HashMap<String, String> с некоторыми фиктивными значениями. Если это удастся, вы поймете, что проблема кроется (как-то) с сериализуемостью вашего класса; альтернативно, если это не сработает, вы можете сосредоточиться на базовой структуре, прежде чем бросать свой собственный класс в микс.

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

Ответ 4

Да, если вы хотите записать объект в файловую систему, этот объект должен реализовать Serializeable. Здесь - это учебник, который должен помочь вам.

Ответ 5

Не беспокойтесь о том, чтобы сделать его Serializable, пока вы не поймете больше о том, что используется. Вы хотите посмотреть FileWriter и google "java file io". Хорошим способом записи этих данных является CSV.

например.

key1, key2, ключ3 valuea1, valuea2, valuea3 valueb1, valueb2, valueb3

Надеюсь, что это поможет.

Ответ 6

Я бы посоветовал использовать Serializable; это намного сложнее сделать правильно, чем кажется на первый взгляд. Казалось бы, просто добавление implements Serializable - это все, что вам нужно сделать. Но на самом деле это добавляет много ограничений на ваш код, с которыми трудно справиться в практическом развитии программного обеспечения (а не в школе). Чтобы понять, насколько ужасны эти ограничения, см. Книгу Эффективная Java (второе издание) от Блоха.

Ответ 7

SERIALIZE HASHMAP: Этот код работает нормально, я реализовал и использовал его в своем приложении. Plz выполняет функции ur соответственно для сохранения карты и получения карты.

Помните, что вам нужно сделать подтверждение того, что объекты, которые вы кладете как значение на карте, должны быть сериализуемыми, значит, они должны реализовать интерфейс serailizbele. ех. Map <.String, String > hashmap = new HashMap <.String, String > ().. здесь, в этой строке... карта и строка оба являются последовательно сериализуемыми, поэтому нам не нужно реализовывать сериализацию для них явно, но если вы ставите ваш собственный объект, который должен быть сериализуемым.


public static void main(String arr[])
{
  Map<String,String> hashmap=new HashMap<String,String>();
 hashmap.put("key1","value1");
    hashmap.put("key2","value2");
    hashmap.put("key3","value3");
    hashmap.put("key4","value4");

     FileOutputStream fos;
    try {
        fos = new FileOutputStream("c://list.ser");

    ObjectOutputStream oos = new ObjectOutputStream(fos);
     oos.writeObject(hashmap);
     oos.close();

     FileInputStream fis = new FileInputStream("c://list.ser");
     ObjectInputStream ois = new ObjectInputStream(fis);
    Map<String,String> anotherList = (Map<String,String>) ois.readObject();

     ois.close();

     System.out.println(anotherList);

 } catch (FileNotFoundException e) {e.printStackTrace();
 } catch (IOException e) {e.printStackTrace();
    } catch (ClassNotFoundException e) {e.printStackTrace();
    }

}