我有一个类,我存储有关文件的信息(路径等)。当我想将文件和其他信息发送给另一个人时,我只序列化该类。
我的文件大于1019字节有问题:它们没有以正确的方式存储。
我能够使用此示例类重新创建问题:
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);
}
}
属性imageSize是以正确的方式编写的,并且字节也以正确的方式读取到缓冲区(将它与只有FileInputStream和FileOutputStream的“文件克隆”进行比较,所以我知道写入缓冲区字节数组的信息是对的。)
现在的问题是: oos.write(缓冲区)有问题吗? 或者是ois.read(数据)中的问题? imageSize以正确的方式写入/读取。
从索引1020开始,我总是在数据字节数组中得到错误的值。
我使用以下代码“测试”了这个类:
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();
有什么明显我不认识的东西吗?我没有收到错误消息或其他内容。注意它的唯一方法是目标图像无效。
答案 0 :(得分:0)
正如Robert在问题中的注释中所述,在使用ObjectOutputStream时,应始终使用writeObject。 write(byte [] data)也会加入一个字节数组。使用readObject和read进行读取也是如此。