java序列化备份及还原

今天工作遇到一个要把查询结果的List序列化保存到本地机,再上传到另外一个应用还原出原来的List再处理的功能.

序列化:在action里面

 

List list = maccount.getMonthLists(cno, startdate, enddate);
String filename = "test.obj"
if(list!=null && !list.isEmpty()){
    try{ 
        String filename=URLEncoder.encode(filename,"UTF-8");
        response.setContentType("application/x-download");
        //filename应该是编码后的(utf-8)
        response.addHeader("Content-Disposition", "attachment; filename=" + filename); 

       //此类实现了一个输出流,其中的数据被写入一个字节数组。缓冲区会随着数据的不断写入而自动增长				
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos); //此类将对像写入字节流
						
        Iterator item=list.iterator();
        while(item.hasNext()){
                Object obj=item.next();
                oos.writeObject(obj);
        }
        byte[] data = baos.toByteArray();//獲取對像的序列化數據
        OutputStream os = response.getOutputStream();
        os.write(data);
        os.flush();
        os.close();
        }catch(Exception se){
                log.debug(">>>>>>导出序列化对帐列表出错!");
                se.printStackTrace();
        }
}

 上面的代码实现在页面下载一个"test.obj"的文件.

 

上传"test.obj"文件还原List:

FormFile ff = frm.getUploadFile();
try{
    InputStream in = ff.getInputStream();
    ObjectInputStream s = new ObjectInputStream(in);
    boolean re=true;//是否结束读取
   while(re){
         try{
	 Object obj = (Object)s.readObject();
	 list.add(obj);
         }catch(EOFException eofe){
	log.debug("Throws EOFException 还原序列化文件时已经读到文件结束符!");
	re=false;
         }catch(Exception e){
	log.debug("IOException1");
	re=false;
	e.printStackTrace();
         }
    }
    in.close();
    s.close();
}catch(IOException ioe){
    log.debug("IOException2");
    ioe.printStackTrace();
}

 上面的代码把"test.obj"还原成list对象,有一个要注意的地方是Object obj = (Object)s.readObject();
方法会抛出一个EOFException 但是不影响程序继续运行.查了一些资料说EOFException 是表示已经读到文件或流的结束符但是读取对象(ObjectInputStream )还没有结束读取动作.

 

大家还有更好的处理方式吗?另外有什么办法避免抛出EOFException ?请大家分享一下!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值