2016-11-08 5 views
2

ファイルに関する情報(パスなど)を格納するクラスがあります。私はファイルと他の情報を別のPersonに送信したいときだけクラスをシリアライズします。クラスのカスタムシリアル化が失敗します

私は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は正しい方法で書き込み/読み込みされます。

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(); 

私は認識しませんでした明白なものがある:私は常にインデックス1020

から始まるデータのバイト配列に間違った値を得た

私はこのコードを使用して、このクラスは、「テスト」?私はエラーメッセージや何かを得ることはありません。それに気づく唯一の方法は、ターゲット画像が無効であることです。

+0

'writeObject'でファイルを読むのは奇妙に思えます。特に、引数なしのコンストラクタがあり、' path'が 'null'であることが考えられます。 'read'からの戻り値もチェックしません。 https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.htmlには、「文字列と配列を含むオブジェクトはすべてwriteObjectで記述されています」と記載されています。 - 単純な 'read'メソッドと' write'メソッドの代わりにreadObject'と 'writeObject'を試してみましたか?そして、なぜあなた自身の 'readObject'と' writeObject'メソッドを持っていますか? – Robert

+0

これは問題をどのようにして得られるかを示すクラスです。nullなどに関するすべては、この時点ではimportamtではありません。読み込み戻り値をチェックしない場合も同じです。確かに私は「本当の」クラスでそれをやっています。私はマシン上にいるとすぐにwriteObjectポイントをチェックします。 – Agyss

+0

これを読む前にoosストリームを閉じる必要があります。すでにディスクにフラッシュされているとは限りません。 –

答えて

0

Robertは、ObjectOutputStreamを使って作業するときには常にwriteObjectを使用する必要があります。また、write(byte [] data)はバイト配列を受け取ります。同じことがreadObjectとreadで読み取る場合も同じです。

関連する問題