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
5 Réponses :
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 }
@Aizaz: Pourquoi vous attendez-vous à ReadObject () code> pour retourner
null code> à 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 code>, vous ne devriez pas vous attendre à
lisaBject () code> pour renvoyer
null code>.
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.
La définition de lishObject () code> sur
ObjectInPhatStream code> ne spécifie pas
null code> 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. P>
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.
Tout d'abord, 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. P> lishabject () code> ne renvoie que "code> null code> si vous avez écrit
null code> au flux lors de la création. S'il n'y a plus de données dans le flux, il lancera un
EofException code>. P>
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 i> Le flux doit correspondre au code que écrit i> le flux. Si vous écrivez 5 objets, vous devez lire cinq. Si vous écrivez une liste avec 5 objets, vous devez appeler readObject () code> une fois (car la liste gérera les 5 objets pour vous).
J'ai eu le même mystérieux eofException code> et ce n'était que le chemin de la classe d'objets à envoyer sur le
ObjectOutputStream code> au
ObjectInPhatStream code>. Ils doivent avoir le même chemin (même nom de paquet et, bien sûr, même nom de classe). P>
J'ai reçu cette erreur car à l'aide d'utiliser Toutefois, de sortie de sortie.write () code> pour écrire un
int code> et
introuvableam.readint () code> pour en lire un. < / p>
sortiestream.write code> écrit un octet code> code> strong> selon la documentation (Met Accepte un
int code> comme paramètre ), à la place, j'ai besoin d'utiliser
de sortie de sortie.writeint code>. p>
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 code>
Ouais je l'ai déjà lu mais comment l'éviter?