用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

Java解决StreamCorruptedException问题

2015-05-16 作者: java源代码大全举报

[java]代码库

/**
 * 这个类可以避免StreamCorruptedException
 * @author Liao
 *
 */
public class MyObjectOutputStream extends ObjectOutputStream {
 
    //无参构造函数
    public MyObjectOutputStream() throws IOException, SecurityException {
        super();
    }
    //有参构造函数
    public MyObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }
     
    /**
     * 重写writeStreamHeader()方法
     */
    @Override
    protected void writeStreamHeader() throws IOException {
        // TODO Auto-generated method stub
        return ;
    }
 
}
//源代码片段来自云代码http://yuncode.net
 
 
工具类:
 
[java] view plaincopy
public class SerializableUtil implements Serializable{ 
   
    private static final long serialVersionUID = 1L; 
   
    /**
     * 序列化对象
     * 用户传一个Object类型对象,和要序列化到的文件路径即可进行序列化
     * @param obj对象
     * @param path 对象要被序列化到的文件路径
     */ 
    public static void serializObject(Object obj,String path){ 
           
        //创建文件 
        File file = new File(path); 
        //判断文件是否存在 
        if (!file.exists()){ 
            //如果文件不存在,就创建文件 
            try
                file.createNewFile(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            
        
        //创建ObjectOutputStream 
        ObjectOutputStream objectOutputStream = null
           
        try
            //定义FileOutputStream,用于创建ObjectOutputStream 
            OutputStream outputStream = new FileOutputStream(file, true); 
            if (file.length() < 1){ 
                objectOutputStream = new ObjectOutputStream(outputStream); 
            } else
                objectOutputStream = new MyObjectOutputStream(outputStream); 
            
            //把对象序列化到文件中 
            objectOutputStream.writeObject(obj); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally {//强制关闭ObjectOutputStream 
            try
                objectOutputStream.close(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            
        
           
           
    
       
    /**
     * 反序列化一个对象
     
     * @param path 要反序列的文件的路径
     * @return 返回一个被反序列化的对象
     */ 
    @SuppressWarnings("resource"
    public static Object unserializObject(String path){ 
        //定义一个对象 
        Object obj = null
        //创建一个文件 
        File file = new File(path); 
           
        try
            //创建文件输入流 
            InputStream inputStream = new FileInputStream(file); 
            //通过文件输入流创建ObjectInputStream 
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); 
            //获取一个对象 
            obj = objectInputStream.readObject(); 
        } catch (Exception e) { 
               
            e.printStackTrace(); 
        
           
        //返回一个对象 
        return obj; 
    
       
    /**
     * 序列化一个集合
     * 用户传一个集合和要序列化到的路径即可进行序列化
     * @param collections 集合
     * @param path 要序列化的路径
     */ 
    public static <T>  void serializList(List<T> collections,String path){ 
        //创建文件 
                File file = new File(path); 
                //判断文件是否存在 
                if (!file.exists()){ 
                    //如果文件不存在,就创建文件 
                    try
                        file.createNewFile(); 
                    } catch (IOException e) { 
                        e.printStackTrace(); 
                    
                
                //创建ObjectOutputStream 
                ObjectOutputStream objectOutputStream = null
                   
                try
                    //定义FileOutputStream,用于创建ObjectOutputStream 
                    OutputStream outputStream = new FileOutputStream(file, true); 
                    if (file.length() < 1){ 
                        objectOutputStream = new ObjectOutputStream(outputStream); 
                    } else
                        objectOutputStream = new MyObjectOutputStream(outputStream); 
                    
                    //遍历集合,然后把对象序列化到文件中 
                    for (T collection : collections){ 
                        objectOutputStream.writeObject(collection); 
                    
                       
                } catch (Exception e) { 
                    e.printStackTrace(); 
                } finally {//强制关闭ObjectOutputStream 
                    try
                        objectOutputStream.close(); 
                    } catch (IOException e) { 
                        e.printStackTrace(); 
                    
                
                   
    
       
    /**
     * 反序列化一个List集合
     * 因为文件中有多个对象,如何在反序列化到末尾时,终止反序列化呢?
     * 这里有一个技巧,我们可以通过一个死循环,一直读知道抛出EOFException时就break退出循环
     * @param path路径
     * @return 返回一个集合
     */ 
    @SuppressWarnings("unchecked"
    public static <T> List<T> unserializList(String path){ 
        //创建一个文件 
        File file = new File(path); 
        //创建一个List集合用于存储反序列化后的对象 
        List<T> collections = new ArrayList<T>(); 
        //定义ObjectInputStream 
        ObjectInputStream objectInputStream = null
        try
            //创建文件输入流 
            InputStream inputStream = new FileInputStream(file); 
            objectInputStream = new ObjectInputStream(inputStream); 
            //获取一个对象 
            while (true){ 
                try
                    //反序列化一个对象 
                    T t = (T) objectInputStream.readObject(); 
                    //把该对象添加到集合中 
                    collections.add(t); 
                } catch (EOFException e) { 
                    break
                
            
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally
            try
                objectInputStream.close(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            
        
           
        //返回一个对象 
        return collections; 
    
       
 
测试类:
[java] view plaincopy
/**
 * 测试类
 * @author Liao
 *
 */ 
public class SerializationTest { 
   
    public static void main(String[] args) { 
           
        Scanner in = new Scanner(System.in); 
   
        boolean flag = true
           
        //创建集合用于存放实体对象 
        List<Person> persons = new ArrayList<Person>(); 
           
        while (flag) { 
            // 输入用户ID 
            System.out.print("请输入UID:"); 
            Integer uid = in.nextInt(); 
            // 输入用户名 
            System.out.print("请输入用户名:"); 
            String uname = in.next(); 
            // 输入性别 
            System.out.print("请输入性别:"); 
            String gender = in.next(); 
   
            //把Person对象存到集合中 
            persons.add(new Person(uid, uname, gender.equals("男")? Gender.MAN : Gender.WOMEN)); 
               
            // 是否继续 
            System.out.print("是否继续? y/n:"); 
   
            String ifContinue = in.next(); 
   
            if (ifContinue.equals("n")) { 
                flag = false
            
        
           
        //序列化 
        SerializableUtil.serializList(persons, "D:\\liaozhongmin.txt"); 
           
        //反序列化 
        List<Person> collections = SerializableUtil.unserializList("D:\\liaozhongmin.txt"); 
        System.out.println(collections); 
    
   
            


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...