Pour mon application, je souhaite utiliser une carte pour agir en tant que base de données. Pour enregistrer et charger une carte, je vous écris/lecture à/de database.ser à l'aide des 2 méthodes:Solution de contournement java.io.EOFException cause par ObjectInputStream
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();
}
}
Je veux charger dans la carte lorsque l'application démarre, donc j'invoque la méthode dans le constructeur comme ceci:
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
}
Je suis conscient de ce qui provoque une erreur, mais je ne sais pas ce que je devrais changer ma conception pour éviter constructeur ObjectInputStream recevoir flux vide! Des suggestions sur ce que je peux faire différemment?
Modifier: Je souhaite noter que dans une nouvelle application, database.ser est vide car il n'y a pas encore d'entrées dans Map.
Merci!
Je ne peux pas faire la tête ou la queue de # 2, et le deuxième point de balle est également sans signification. Votre «autre façon» est exactement la même que votre façon originale de vérifier la vacuité. – EJP
Je pense que vérifier pour le fichier vide et revenir de la méthode est exactement ce dont j'avais besoin! J'appelle saveDB() dans les méthodes où je mets ou modifie des valeurs dans la carte pour m'assurer que toutes les données sont sauvegardées au cas où le serveur tombe en panne. Je pense que je comprends maintenant pourquoi appeler la méthode saveDB() dans le constructeur avant que loadDB() ne fonctionne. Il écrit dans un fichier une carte vide, mais encore des octets qui traversent le flux. Le seul problème est que si certaines valeurs sont déjà stockées dans Map et que je les sauvegarde dans un fichier, l'instanciation suivante d'une classe remplacera le fichier par une carte vide et toutes les données seront perdues. Merci de votre aide! – GarRudo
De rien. S'il vous plaît essayez d'éviter la question en double comme @EJP mentionné. Cela aidera à éviter les erreurs. Je vous remercie. –