- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 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/
关于 ByteArrayInputStream 的文档说: java.io.ByteArrayInputStream.ByteArrayInputStream(byte[] buf) Creates
我想知道是否是 ByteArrayInputStream java.io 包中的类好用吗?或者,如果要通过使用字节数组将其与自己的类进行比较,例如: private int pos = 0; priv
使用 ByteArrayInputStream 和/或 ByteArrayOutputStream 的一些实际领域是什么?也欢迎提供示例。 如果搜索示例,通常会找到如下内容: byte[] buf =
我正在研究流媒体网络摄像头。 现在我可以进行 1:1 TCP 网络摄像头通信。 问题是即使 gc 运行,堆内存也不会减少。 我尝试了重置(),刷新(),关闭()。 一切看起来都很好,但 new Byt
我有方法返回将显示为文本字符串的值。所以我正在做的是转换为 ByteArrayInputStream。 public String method() { inputStream = new B
假设一个函数如下: InputStream func() { byte[] buffer = new byte[] {0,1,2,3}; return
我只是想弄清楚 ByteArrayInputStream 中的字节类型。在一种情况下,我存储一个byte[],在另一种情况下,我存储一个Hashmap。以下代码仅在 byte[] 的情况下在 Obje
java.io 类太多了,对于其中一些我真的不明白什么时候需要它们,例如: 字节数组输入流、字节数组输出流 序列输入流, PushbackInputStream、PushbackReader 字符串读
基本上我使用(在groovy中)以下结构: InputStream in = new ByteArrayInputStream("one two three four".getBytes()); 但是
我将使用 Jsch ssh 到另一台服务器 并检查路径是否存在 但是我发现baos.toString() 将在终端上打印出所有结果: test -d /root/bin/python || echo
我正在使用一个 ByteArrayInputStream,它包含一个 XML 文档,该文档由一个元素组成,元素的内容是一个大的 base 64 编码字符串。我需要删除周围的标签,以便解码文本并将其输出
首先,在下面的代码中,我试图做的是使用“byteBuffer[0].length”找到二维字节数组的长度,但它实际上不起作用。当我打印 'byteBuffer[0].length' 时,它给出的输出为
我正在尝试通过 telnet 与 Windows 服务器中的应用程序进行交互,因此我使用的是 TelnetClient() 方法。我可以使用 System.in.read() 进行交互(发送命令和检索
我有一个 JPA AttributeConverter,用于将 String 转换为 gzipped byte[] 并返回。 转换方法相当简单: public byte[] convertToData
我正在尝试以 blob 数据格式 ([B@e96bf) 加载 MySQL 数据库中的图像,但无法将其加载到 JLabel,如下所示。它显示 ByteArrayInputStream 为空。 byte[
我想从 ByteArrayInputStream 获取内部字节数组。我不想扩展该类或将其写入另一个字节数组。有实用程序类可以帮助我做到这一点吗? 谢谢, 最佳答案 您无法访问相同的字节数组,但您可以轻
我在测试中遇到了这段代码。 byte[] bytes = new byte[] { -1, 1, 0x0 }; InputStream in = new ByteArrayInputStream(by
以下是在处理文件之前将整个文件读入内存的三种方法: 方法一: fis = new FileInputStream(file); bis = new BufferedInputStream(fis);
我有一个 ByteArrayInputStream 形式的图像。我想把它做成我可以保存到我的文件系统中某个位置的东西。 我一直在兜圈子,你能不能帮帮我。 最佳答案 如果您已经在使用 Apache co
我读过 this post但我不关注。我看过this但还没有看到使用 ByteArrayOutputStream 将 ByteArrayInputStream 转换为 String 的正确示例。 要将
我是一名优秀的程序员,十分优秀!