2016-11-08 73 views
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(); 

有什麼明顯的我不認識?我沒有收到錯誤消息或其他內容。要注意的唯一方法是目標圖像無效。

+0

對於我來說,在'writeObject'中讀取一個文件似乎很奇怪,尤其是考慮到你有一個無參數構造函數而'path'可能是'null'。你也不檢查'read'的返回值。 https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html說:「任何對象,包括字符串和數組,都是用writeObject寫的。」 - 您是否嘗試過使用readObject和writeObject來代替簡單的read和write方法?爲什麼甚至有你自己的'readObject'和'writeObject'方法? – Robert

+0

這只是一個類來顯示我如何得到這個問題 - 關於空等的一切都不是重要的,因爲它只是一個重現它的例子。同樣是不檢查讀取返回值。當然,我在我的「真實」課上做。當我再次在我的機器上時,我將檢查writeObject點。 – Agyss

+0

在嘗試讀取它之前,您應該關閉oos流,但不能保證已經將其刷新到磁盤。 –

回答

0

正如Robert在問題下的註釋中所述,在使用ObjectOutputStream時應始終使用writeObject。另外寫入(byte []數據)將接受一個字節數組。使用readObject和read進行讀取也是如此。