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