4

ObjectOutputStream を使用して多数のオブジェクトをディスクに書き込みました。読み取り中、実装上の理由から、最初にファイルを ByteArray として取得します。バッファリングされた配列を読み取り、そこからデータをデコードしたいと考えています。ここにコードスニペットがあります

byte [] fileArray=org.apache.commons.io.IOUtils.toByteArray(filePath);

ObjectInputStream in=new ObjectInputStream(new ByteArrayInputStream(fileArray));

while(true){
 Records pos=(Records)in.readObject();
}

ただし、このエラーが発生します

java.io.StreamCorruptedException: invalid stream header: 2F6C6F63

要約すると、読み取り中にディスクからではなく、ファイルをメモリにロードしてからオブジェクトをデコードしたいと考えています。


ファイルは次のように書かれています。

fout=new FileOutputStream(filePath);
bos=new ByteArrayOutputStream();
oos=new ObjectOutputStream(bos);

for(int i=0;i<size;i++){
 oos.writeObject(list.get(i));
}
oos.flush();
bos.writeTo(fout);
bos=null;
oos=null;
fout.flush();
fout.close();

oosはまったく閉じていません!


エラーを再現する完全な例を次に示します。

import java.util.*;
import java.io.*;

import org.apache.commons.io.IOUtils.*;

public class Example{

    private int[] data;

    public Example(){
        data=new int[40];
    }

    public void generate(){
        for(int i=0;i<data.length;i++){
            data[i]=i;
        }
        System.out.println("Data generated!");
    }

    public void write(){
        FileOutputStream fout=null;
        ByteArrayOutputStream bos=null;
        ObjectOutputStream oos=null;
        try{
            fout=new FileOutputStream("obj.data");
            bos=new ByteArrayOutputStream();
            oos=new ObjectOutputStream(bos);
            for(int i=0;i<data.length;i++){
                oos.writeObject((Integer)data[i]);
            }
            oos.flush();
            bos.writeTo(fout);
            bos=null;
            oos=null;
            fout.flush();
            fout.close();
        }catch(IOException ioe){}
        System.out.println("Data written!");
    }

    public void read(){
        ObjectInputStream in=null;
        try{
            byte[] fileArray=org.apache.commons.io.IOUtils.toByteArray("obj.data");
            in=new ObjectInputStream(new ByteArrayInputStream(fileArray));
            while(true){
                Integer data=(Integer)in.readObject();
            }
        }catch (EOFException eofe){
            try{
                in.close();
            }catch (IOException ioe){
                ioe.printStackTrace();
            }
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }       
        System.out.println("Data read!");
    }

    public static void main(String[] args){
        Example example=new Example();
        example.generate();
        example.write();
        example.read();
    }


}
4

1 に答える 1

3

さて、今それを見つけました。これが問題です:

byte[] fileArray=org.apache.commons.io.IOUtils.toByteArray("obj.data");

その方法は、あなたが思っていることをしません:

プラットフォームのデフォルトの文字エンコードを使用して、文字列の内容をbyte[]として取得します。

ファイルをまったくロードしていません。

代わりにこれを使用する場合:

 byte[] fileArray = 
     org.apache.commons.io.FileUtils.readFileToByteArray(new File("obj.data"));

...その後、データは正しく復元されます。

(ちなみに、個人的にはこの種のことにはグアバが好きです...)

于 2013-01-25T19:55:27.450 に答える