Java: запись / чтение карты с диска - PullRequest
13 голосов
/ 19 января 2011

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

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

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

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

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

Ответы [ 7 ]

33 голосов
/ 19 января 2011

Если вы не особенно заинтересованы в Object, вам просто нужна пара ключ-значение 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 голосов
/ 19 января 2011
Map m = new HashMap();
// let's 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();
1 голос
/ 19 января 2011

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

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

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

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

0 голосов
/ 23 октября 2012

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

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


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

}
0 голосов
/ 19 января 2011

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

0 голосов
/ 19 января 2011

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

например.

key1, key2, key3 valuea1, valuea2, valuea3 valueb1,значение b2, значение b3

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

0 голосов
/ 19 января 2011

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

...