2
我有一個類,其中存儲有關文件(路徑等)的信息。當我想將文件和其他信息發送給另一個人時,我只序列化這個類。類定製序列化失敗
那裏我有一個大於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(buffer)有問題嗎? 或者是ois.read(data)中的問題? 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();
有什麼明顯的我不認識?我沒有收到錯誤消息或其他內容。要注意的唯一方法是目標圖像無效。
對於我來說,在'writeObject'中讀取一個文件似乎很奇怪,尤其是考慮到你有一個無參數構造函數而'path'可能是'null'。你也不檢查'read'的返回值。 https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html說:「任何對象,包括字符串和數組,都是用writeObject寫的。」 - 您是否嘗試過使用readObject和writeObject來代替簡單的read和write方法?爲什麼甚至有你自己的'readObject'和'writeObject'方法? – Robert
這只是一個類來顯示我如何得到這個問題 - 關於空等的一切都不是重要的,因爲它只是一個重現它的例子。同樣是不檢查讀取返回值。當然,我在我的「真實」課上做。當我再次在我的機器上時,我將檢查writeObject點。 – Agyss
在嘗試讀取它之前,您應該關閉oos流,但不能保證已經將其刷新到磁盤。 –