2016-12-06 5 views
5

Aujourd'hui, j'ai rencontré un comportement étrange dans la sérialisation et la désérialisation java ("étrange" parce que je ne comprends pas)Comment l'espace disque peut provoquer Java. io. EOFException

Je numérotais et désérialisait un objet à partir d'un répertoire partagé Linux. Tout en sérialisant tout fonctionnait sans aucun problème, mais quand j'ai essayé de désérialiser le même fichier, il lance java. io. EOFException. De plus, la désérialisation n'échouait que pour ce fichier nouvellement créé et fonctionnait pour tous les autres anciens fichiers de ce répertoire.

J'ai donc cherché sur Internet et trouvé un fil qui dit que l'espace disque faible peut également être la cause de cette erreur.

J'ai donc nettoyé certains fichiers temporaires et tout a fonctionné. Je ne comprends pas comment l'espace disque faible peut seulement affecter la désérialisation et non la sérialisation? J'utilise apache commons SerializationUtils class. Ci-dessous le code pour la sérialisation et la désérialisation

SerializationUtils. serialize(myObject, new FileOutputStream(new File(sharePath+FILEName) ; 


MyObject object=SerializationUtils. deserialize(new FileInputStream(new File(sharePath+FILEName); 

Il serait vraiment utile si quelqu'un peut expliquer ce comportement. Je pense que c'est un bug dans SerializationUtils peut-être engloutir IOException.

Merci

+0

Il ne peut pas, sauf si vous avez ignoré une 'IOException 'préalable lors de * l'écriture * du fichier. – EJP

+0

Comme je ne fais pas de sérialisation à la main, les exceptions IO sont gérées par SerializationUtils. C'est dans leur javadoc. –

+0

Donc, c'est leur problème, ou leur mauvaise conception de l'API. – EJP

Répondre

7

Je soupçonne que lors de l'écriture du fichier, un IOException est jeté parce que l'espace disque est épuisé, mais le début des données sérialisés était encore écrites sur le disque. Cela signifierait que les données sérialisées stockées sur le disque sont incomplètes, donc la lecture donnerait des résultats invalides, ce qui dans votre cas provoque une exception EOF

Afin de résoudre ce problème, vous devez voir quand l'exception E/S est levé en raison de l'espace disque épuisé avec exception.getMessage() et assurez-vous de ne pas écrire des données incomplètes.

+0

M en utilisant apache commons, et je ne pouvais pas trouver la preuve de votre réclamation à l'intérieur .. je sais si vous avez trouvé quelque chose qui englobe IOException dans SerializationUtils de Apache .. –

+0

Etes-vous en train d'essayer d'attraper le SerializationException? Parce que cela sera lancé, pas une exception IOException, si l'écriture d'un fichier lève une exception IOException –