J'ai une classe où je stocke des informations sur les fichiers (chemin, etc.). Je ne sérialise la classe que lorsque je veux envoyer les fichiers et autres informations à une autre personne.
Là, j'ai un problème avec les fichiers de plus de 1019 octets: ils ne sont pas stockés correctement.
J'ai pu recréer le problème avec cet exemple de classe:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializableImage implements Serializable{
private static final long serialVersionUID = -2079629440538093893L;
private String path;
private byte[] data;
public SerializableImage()
{}
public SerializableImage(String path) {
this.path = path;
}
public byte[] getData() {
return data;
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
int imageSize = ois.readInt();
data = new byte[imageSize];
ois.read(data);
}
private void writeObject(ObjectOutputStream oos) throws IOException {
int imageSize;
File file = new File(path);
imageSize = (int) file.length();
oos.writeInt(imageSize);
InputStream is = null;
byte[] buffer = new byte[imageSize];
try {
is = new FileInputStream(file);
is.read(buffer);
} finally {
if (is != null) {
is.close();
}
}
oos.write(buffer);
}
}
L'attribut imageSize est écrit de la bonne manière, et les octets sont également lus dans le tampon de la bonne manière (comparé au "clonage de fichier" avec juste un FileInputStream et un FileOutputStream, donc je sais que les informations écrites dans le tableau d'octets du tampon sont correctes) .
La question est maintenant: y a-t-il un problème avec le oos.write (tampon)? Ou est le problème dans le ois.read (data)? imageSize est écrit / lu de la bonne manière.
J'ai toujours des valeurs erronées dans le tableau d'octets de données à partir de l'index 1020.
J'ai "testé" cette classe avec ce code:
SerializableImage sourceImage = new SerializableImage("C:\\\\source.jpg");
File serializableData = new File("C:\\\\data.data");
File targetImage = new File("C:\\\\target.jpg");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serializableData));
oos.writeObject(sourceImage);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(serializableData));
sourceImage = (SerializableImage) ois.readObject();
FileOutputStream imageOutputStream = new FileOutputStream(targetImage);
byte[] data = sourceImage.getData();
imageOutputStream.write(data);
imageOutputStream.flush();
ois.close();
oos.close();
imageOutputStream.close();
Y a-t-il quelque chose d'évident que je n'ai pas reconnu? Je ne reçois pas de message d'erreur ou quelque chose. La seule façon de le remarquer est que l'image cible n'est pas valide.
Comme Robert l'a indiqué dans les commentaires sous la question, writeObject doit toujours être utilisé lorsque vous travaillez avec un ObjectOutputStream. Ecrire également (byte [] data) accepterait un tableau d'octets. Il en va de même pour la lecture avec readObject et read.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots