使用ObjectInputStream出现的错误:java.io.StreamCorruptedException: invalid stream header

萌萌的卡洛奇 2014-08-16 11:48:21
问题:从文件中读出的流使用ObjectInputStream总是会出现java.io.StreamCorruptedException: invalid stream header: 32360D0A 这样的错误

File file = new File("F:/test/file.dat");

InputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
File f = (File)ois.readObject();

System.out.println(f.getName());

总是会在第4行出错
在网上查了很多,这里应该不存在重复新建对象输出流的问题吧
...全文
1139 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ceekay_ 2015-09-15
  • 打赏
  • 举报
回复
我第一次用就报错,在网上找了好久也没找到具体原因。
tourism5 2014-10-31
  • 打赏
  • 举报
回复
请问楼主是如何解决的呢? 我也遇到一样的问题了,不过我不是传文件,我是从数据库取数据装进List 然后用对象流传, 第一次传没问题,第二次传就会报这样的异常
程序男 2014-08-18
  • 打赏
  • 举报
回复
引用 7 楼 yuzhongzi81 的回复:
[quote=引用 3 楼 u010504064 的回复:] 你使用对象流读取数据是不是有点大材小用了,这个方法通常用于对象序列化读取对象时使用,如果你想单纯的读取里面的内容用FileInputStream就行、
我是想着本来是一个文件对象,测试转化流之后能不能再转化成为一个文件对象[/quote] 按道理应该能,既然是文件对象,那为何多此一举呢,直接用IO即可。
skgary 2014-08-18
  • 打赏
  • 举报
回复
引用 5 楼 yuzhongzi81 的回复:
[quote=引用 1 楼 skgary 的回复:] 楼主,你这几行代码的目的是什么啊? 你这个文件的内容是不是ObjectOutputStream创建的呢:
是这样的,我想把一个文件通过BASE64Encoder方法转化成为一个字符串传给服务器,然后再后台进行解码之后通过得到字节数组之后再转化成为一个文件对象[/quote] 那你应该把文件的内容全部读出来啊。 或者,你服务是不是http的啊?直接用http client把内容直接传上去不就结了。
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 3 楼 u010504064 的回复:
你使用对象流读取数据是不是有点大材小用了,这个方法通常用于对象序列化读取对象时使用,如果你想单纯的读取里面的内容用FileInputStream就行、
我是想着本来是一个文件对象,测试转化流之后能不能再转化成为一个文件对象
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 2 楼 xiaofeifeiloving 的回复:
你把这2句File file = new File("F:/test/file.dat"); InputStream is = new FileInputStream(file); 改为一句试一试: InputStream is=new FileInputStream(("F:/test/file.dat");
效果是一样的
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 1 楼 skgary 的回复:
楼主,你这几行代码的目的是什么啊? 你这个文件的内容是不是ObjectOutputStream创建的呢:
是这样的,我想把一个文件通过BASE64Encoder方法转化成为一个字符串传给服务器,然后再后台进行解码之后通过得到字节数组之后再转化成为一个文件对象
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 13 楼 skgary 的回复:
楼主可以忘记springMvc... 参考一下下面这个 http://www.cnblogs.com/blogsme/archive/2013/04/12/3016696.html
谢谢你
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 20 楼 u010504064 的回复:
[quote=引用 18 楼 yuzhongzi81 的回复:] [quote=引用 16 楼 u010504064 的回复:] [quote=引用 12 楼 yuzhongzi81 的回复:] [quote=引用 9 楼 u010504064 的回复:] [quote=引用 7 楼 yuzhongzi81 的回复:] [quote=引用 3 楼 u010504064 的回复:] 你使用对象流读取数据是不是有点大材小用了,这个方法通常用于对象序列化读取对象时使用,如果你想单纯的读取里面的内容用FileInputStream就行、
我是想着本来是一个文件对象,测试转化流之后能不能再转化成为一个文件对象[/quote] 按道理应该能,既然是文件对象,那为何多此一举呢,直接用IO即可。[/quote] 那你知道怎么用HttpClient结合springmvc把文件传上去么?[/quote] 不知道,我也在学spring mvc,但是我用的是另外一种方法,spring mvc自带的文件上传类。而且速度挺快的,至于你说的HttpClient我不太清楚,没有接触过,不过我有spring mvc的视频。正在看。[/quote] 哦,我也想用springmvc自带的上传文件呢,但是项目中是要用HttpClient[/quote] 哦,那你百度一下吧,这个我还真不太清楚[/quote] 呵呵,谢谢你哦
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 21 楼 nimade511 的回复:
	public static void main(String[] args) throws Exception{
		File file = new File("C:\\Users\\zy\\Desktop\\tt.txt");
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(file);
		byte[] bs = baos.toByteArray();
		ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bs));
		File f = (File)ois.readObject();
		System.out.println(f.getName());
	}
嗯,是要先用ObjectOutputStream序列化,然后再使用ObjectInputStream重新获取对象
nimade511 2014-08-18
  • 打赏
  • 举报
回复
	public static void main(String[] args) throws Exception{
		File file = new File("C:\\Users\\zy\\Desktop\\tt.txt");
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(file);
		byte[] bs = baos.toByteArray();
		ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bs));
		File f = (File)ois.readObject();
		System.out.println(f.getName());
	}
程序男 2014-08-18
  • 打赏
  • 举报
回复
引用 18 楼 yuzhongzi81 的回复:
[quote=引用 16 楼 u010504064 的回复:] [quote=引用 12 楼 yuzhongzi81 的回复:] [quote=引用 9 楼 u010504064 的回复:] [quote=引用 7 楼 yuzhongzi81 的回复:] [quote=引用 3 楼 u010504064 的回复:] 你使用对象流读取数据是不是有点大材小用了,这个方法通常用于对象序列化读取对象时使用,如果你想单纯的读取里面的内容用FileInputStream就行、
我是想着本来是一个文件对象,测试转化流之后能不能再转化成为一个文件对象[/quote] 按道理应该能,既然是文件对象,那为何多此一举呢,直接用IO即可。[/quote] 那你知道怎么用HttpClient结合springmvc把文件传上去么?[/quote] 不知道,我也在学spring mvc,但是我用的是另外一种方法,spring mvc自带的文件上传类。而且速度挺快的,至于你说的HttpClient我不太清楚,没有接触过,不过我有spring mvc的视频。正在看。[/quote] 哦,我也想用springmvc自带的上传文件呢,但是项目中是要用HttpClient[/quote] 哦,那你百度一下吧,这个我还真不太清楚
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 15 楼 u011650830 的回复:
ObjectInputStream 是用来写对象的流吧(它操作的类必须实现serializable接口,可以用transient关键字来无视写的对象什么),你用来操作文件不好吧?
嗯,应该是你说的这样,要么就是操作的文件已经经过了序列化的才好
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 16 楼 u010504064 的回复:
[quote=引用 12 楼 yuzhongzi81 的回复:] [quote=引用 9 楼 u010504064 的回复:] [quote=引用 7 楼 yuzhongzi81 的回复:] [quote=引用 3 楼 u010504064 的回复:] 你使用对象流读取数据是不是有点大材小用了,这个方法通常用于对象序列化读取对象时使用,如果你想单纯的读取里面的内容用FileInputStream就行、
我是想着本来是一个文件对象,测试转化流之后能不能再转化成为一个文件对象[/quote] 按道理应该能,既然是文件对象,那为何多此一举呢,直接用IO即可。[/quote] 那你知道怎么用HttpClient结合springmvc把文件传上去么?[/quote] 不知道,我也在学spring mvc,但是我用的是另外一种方法,spring mvc自带的文件上传类。而且速度挺快的,至于你说的HttpClient我不太清楚,没有接触过,不过我有spring mvc的视频。正在看。[/quote] 哦,我也想用springmvc自带的上传文件呢,但是项目中是要用HttpClient
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 14 楼 vnvlyp 的回复:
用Base64传小文件是可以的,大文件也只是效率不高,不可能出错的,你肯定是转换或者读写的时候没弄好,导致文件被破坏。
我用BASE64Encoder来编码从文件中读取出来的直接数组,然后再用BASE64Decoder解码由数组得到的字符串,然后再用输出流是可以将文件还原的,所以应该不存在文件破坏吧 InputStream is = new FileInputStream("F:/test/GPSfile1.dat"); byte[] b = new byte[1024]; int len = 0; String base = ""; while((len = is.read(b)) > 0) { BASE64Encoder encode = new BASE64Encoder(); base += encode.encode(b); } BASE64Decoder decode = new BASE64Decoder(); byte[] bt = decode.decodeBuffer(base); OutputStream os = new FileOutputStream(new File("D:/text.txt")); os.write(bt); os.flush(); is.close(); os.close();
程序男 2014-08-18
  • 打赏
  • 举报
回复
引用 12 楼 yuzhongzi81 的回复:
[quote=引用 9 楼 u010504064 的回复:] [quote=引用 7 楼 yuzhongzi81 的回复:] [quote=引用 3 楼 u010504064 的回复:] 你使用对象流读取数据是不是有点大材小用了,这个方法通常用于对象序列化读取对象时使用,如果你想单纯的读取里面的内容用FileInputStream就行、
我是想着本来是一个文件对象,测试转化流之后能不能再转化成为一个文件对象[/quote] 按道理应该能,既然是文件对象,那为何多此一举呢,直接用IO即可。[/quote] 那你知道怎么用HttpClient结合springmvc把文件传上去么?[/quote] 不知道,我也在学spring mvc,但是我用的是另外一种方法,spring mvc自带的文件上传类。而且速度挺快的,至于你说的HttpClient我不太清楚,没有接触过,不过我有spring mvc的视频。正在看。
总会想起你 2014-08-18
  • 打赏
  • 举报
回复
ObjectInputStream 是用来写对象的流吧(它操作的类必须实现serializable接口,可以用transient关键字来无视写的对象什么),你用来操作文件不好吧?
vnvlyp 2014-08-18
  • 打赏
  • 举报
回复
用Base64传小文件是可以的,大文件也只是效率不高,不可能出错的,你肯定是转换或者读写的时候没弄好,导致文件被破坏。
skgary 2014-08-18
  • 打赏
  • 举报
回复
楼主可以忘记springMvc... 参考一下下面这个 http://www.cnblogs.com/blogsme/archive/2013/04/12/3016696.html
萌萌的卡洛奇 2014-08-18
  • 打赏
  • 举报
回复
引用 9 楼 u010504064 的回复:
[quote=引用 7 楼 yuzhongzi81 的回复:] [quote=引用 3 楼 u010504064 的回复:] 你使用对象流读取数据是不是有点大材小用了,这个方法通常用于对象序列化读取对象时使用,如果你想单纯的读取里面的内容用FileInputStream就行、
我是想着本来是一个文件对象,测试转化流之后能不能再转化成为一个文件对象[/quote] 按道理应该能,既然是文件对象,那为何多此一举呢,直接用IO即可。[/quote] 那你知道怎么用HttpClient结合springmvc把文件传上去么?
加载更多回复(6)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧