11
votes

Exception mystérieuse EOF Java avec ReadObject

Le code suivant produit un Eofexception code>. Pourquoi est-ce?

03-07 14:29:01.996: WARN/System.err(13984): java.io.EOFException
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.DataInputStream.readByte(DataInputStream.java:131)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:628)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:907)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217)
03-07 14:29:01.996: WARN/System.err(13984):     at 


2 commentaires

Javadoc: Toute tentative de lecture de données d'objet dépassant les limites des données personnalisées écrits par la méthode WriteObject correspondante entraînera la lancée d'une valeur FacultativeDataAxception avec une valeur de champ EOF de TRUE


Ouais je l'ai déjà lu mais comment l'éviter?


5 Réponses :


9
votes

dépend du nombre d'objets que votre fichier contient. S'il n'a qu'un seul objet, vous pouvez désérialiser en une étape.

try {
    Object temp = ois.readObject();
}
catch(Exception e) {
    //handle it
}


7 commentaires

@Aizaz: Pourquoi vous attendez-vous à ReadObject () pour retourner null à la fin du fichier? Cela ne signifie pas, il est spécifié de toujours retourner l'objet ou lancer une exception. Donc, à moins que vous ayez explicitement sérialisé null , vous ne devriez pas vous attendre à lisaBject () pour renvoyer null .


Ensuite, comment détecter nous sommes à la fin du fichier? Je veux dire comment éviter EOF Exception?


@Aizaz - ReadObject () lira l'intégralité du fichier à la fois et la désériorialisera pour vous. Assurez-vous simplement que vous appelez cela une seule fois et non dans une boucle.


@aDarshr Tank vous SOOOOOOOOOOOOOOOOOOA BAIME Cher ami.


@Adasrshr qui est trompeur - ReadObject désérialisera un objet du fichier. Si le fichier contenait un seul objet, vous êtes correct. Si toutefois, il contenait plus d'un objet, vous devriez appeler LoadObject () plus d'une fois.


@Andyt - Vous vous trompez! Veuillez lire le FAQ sur la sérialisation du soleil


@AdaSrshr Consultez ici: Télécharger.oracle .com / Javase / 1.4.2 / Docs / API / Java / IO / ... et vous verrez un exemple de lecture de plusieurs objets d'un flux. La FAQ semble se référer à des limitations de l'objet WriteReMeam et contredit les documents actuels de l'API Java.



2
votes

La définition de lishObject () sur ObjectInPhatStream ne spécifie pas null lorsque la fin du flux est atteinte. Au lieu de cela, une exception est lancée si vous essayez de lire un objet supplémentaire au-delà de la fin du fichier.


2 commentaires

Ensuite, comment détecter nous sommes à la fin du fichier? Je veux dire comment éviter EOF Exception?


Soit stocker des informations dans le fichier qui vous indique le nombre d'objets à attendre ou de gérer correctement l'exception EOF. N'oubliez pas que les exceptions ne sont pas nécessairement des «échecs», mais peuvent être utilisés comme moyen de propager des changements d'état jusqu'à la pile.



8
votes

Tout d'abord, lishabject () ne renvoie que "code> null si vous avez écrit null au flux lors de la création. S'il n'y a plus de données dans le flux, il lancera un EofException .

Si vous ne vous attendez pas à l'EOF, la raison est probablement que le flux est corrompu. Cela peut arriver si vous oubliez de le fermer après avoir écrit des données à elle.


4 commentaires

Ensuite, comment détecter nous sommes à la fin du fichier? Je veux dire comment éviter EOF Exception?


@Aizaz: La efException vous dit que. Des exceptions vérifiées sont censées être attrapées et examinées pour le flux de contrôle. Ils ne sont pas des erreurs mais des codes de retour supplémentaires. Parfois. Si utilisé correctement. Ce qui n'est pas le cas pour la plupart des impceptions d'IoException. Mais correct pour l'expression eofException. ... ahem. Une autre solution consiste à écrire le nombre d'objets dans le flux avant les objets. Vous pouvez donc boucler un nombre de fois connu de fois. Ou mettre les objets dans un conteneur comme une liste ou un tableau et chargez plutôt le conteneur.


Je pense que c'est la bonne réponse: @aizaz - ReadObject () lira l'intégralité du fichier à la fois et de les désériorialiser pour vous. Assurez-vous simplement que vous appelez cela une seule fois et non dans une boucle. - Adarshr il y a 18 heures


@Aizaz: Ceci n'est vrai que lorsque vous écrivez un seul objet dans le fichier. Votre code à lire Le flux doit correspondre au code que écrit le flux. Si vous écrivez 5 objets, vous devez lire cinq. Si vous écrivez une liste avec 5 objets, vous devez appeler readObject () une fois (car la liste gérera les 5 objets pour vous).



5
votes

J'ai eu le même mystérieux eofException et ce n'était que le chemin de la classe d'objets à envoyer sur le ObjectOutputStream au ObjectInPhatStream . Ils doivent avoir le même chemin (même nom de paquet et, bien sûr, même nom de classe).


0 commentaires

0
votes

J'ai reçu cette erreur car à l'aide d'utiliser de sortie de sortie.write () pour écrire un int et introuvableam.readint () pour en lire un. < / p>

Toutefois, sortiestream.write écrit un octet selon la documentation (Met Accepte un int comme paramètre ), à la place, j'ai besoin d'utiliser de sortie de sortie.writeint .


0 commentaires