gpt4 book ai didi

java - StreamCorruptedException 与 ObjectInputStream 和 ByteArrayInputStream

转载 作者:搜寻专家 更新时间:2023-11-01 03:08:30 24 4
gpt4 key购买 nike

我使用 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();
}


}

最佳答案

好的,现在找到了。这是问题所在:

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

That method不做你认为它做的事:

Get the contents of a String as a byte[] using the default character encoding of the platform.

它根本没有加载文件

如果你改用它:

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

...然后数据被正确恢复。

(顺便说一句,我个人更喜欢 Guava 来处理这种事情...)

关于java - StreamCorruptedException 与 ObjectInputStream 和 ByteArrayInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com