Для своего приложения я хочу использовать карту в качестве базы данных. Чтобы сохранить и загрузить карту, я пишу/читаю ее в/из database.ser, используя эти 2 метода:
private synchronized void saveDB() {
try {
fileOut = new FileOutputStream(db);
out = new ObjectOutputStream(fileOut);
out.writeObject(accounts);
fileOut.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
private void loadDB() {
try {
fileIn = new FileInputStream(db);
in = new ObjectInputStream(fileIn); // that is where error is produced if fileIn is empty
accounts = (Map<String, Client>) in.readObject();
in.close();
fileIn.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Я хочу загрузить карту при запуске приложения, поэтому я вызываю метод в конструкторе следующим образом:
protected DriveatorImpl() {
accounts = new ConcurrentHashMap<String, Client>();
db = new File("C:/Users/eduar/git/Multy-Threaded-Bank-System/Bank-Services/database.ser");
// also, any suggestions how can I make path to a file more flexible in case I want to run Server side of an app on different machine?
if (!db.exists()) {
try {
db.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
loadDB(); // loads database when server start
}
Я знаю, что вызывает ошибку, но я не знаю, что мне следует изменить в моем дизайне, чтобы конструктор ObjectInputStream не получал пустой поток! Любые предложения о том, что я могу сделать по-другому?
Изменить: я хочу отметить, что в новом запуске приложения database.ser пуст, поскольку в карту еще не было внесено записей.
Спасибо!