`
moxu
  • 浏览: 63795 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

java对象流,实现追加的方法!

阅读更多
问题描述: 用类ObjectOutputStream向文件写读对象时,碰到一个问题:新建一个文 
  件,用输出流ObjectOutputStream向文件连续写几个对象,关闭输出流,然 
  后读取,这些对象都可以读出;这时在向该文件增加对象,新写的对象就读不出了,不知什么原因?请教了! 
  
  问题出现的原因:ObjectOutputStream建立后第一次写入一个对象时, 会在对象数据前写入一些标志的数据“AC ED 
  00 05”(用ultraEdit打开),应该是流相关的信息。当你关闭 
  ObjectOutputStream后再重新打开往文件里面写对象时(append方式),就会再一次把“AC ED 00 
  05”写入文件,而这些信息并不是你写入对象的数据,所以当你用ObjectInputStream来读取对象时,流会将除第一个“AC ED 00 
  05”以外的数据当作各个对象的数据,造成无法解析,所以读取时有一个java.io.StreamCorruptedException出现。 
  这个可以通过编辑Info.dat来验证,只要将“AC ED 00 05”删除(第一个“AC ED 00 05”保留)就可以正常读出后来加入的对象。 
  给出一个比较笨的解决方法: 在以后要添加新的对象到Info.dat时,将里面原有的对象读出放入ArrayList中,清空文件,再将对象集一次写入。 
  
  尝试解决办法: 那个“AC ED 00 05”是 
  ObjectOutputStream.writeSystemHeader()写进去的,你可以继承ObjectOutputStream类,覆盖这个方法。 
  在你自己的writeSystemHeader()里判断是不是第一次写入一个文件,如果是向一个文件大小不为零的文件追加的话,就调用 
  super.reset(),如果是第一次写这个文件,不是追加,就调用super.writeSystemHeader() 

自定义类MyObjectOutputStream 
Java代码  
public class MyObjectOutputStream extends ObjectOutputStream {  
    //定义成静态的好处  
    private static File f;  
  
    /** 
     * 初始化静态文件对象,并返回类对象 
     * @param file 文件对象,用于初始化静态文件对象 
     * @param out 输出流 
     * @return MyObjectOutputStream 
     * @throws IOException 
     */  
    public static  MyObjectOutputStream newInstance(File file, OutputStream out)  
            throws IOException {  
        f = file;//本方法最重要的地方:构建文件对象,是两个文件对象属于同一个  
        return new MyObjectOutputStream(out, f);  
    }  
  
    @Override  
    protected void writeStreamHeader() throws IOException {  
        if (!f.exists() || (f.exists() && f.length() == 0)) {  
            super.writeStreamHeader();  
        } else {  
            super.reset();  
        }  
  
    }  
  
    public MyObjectOutputStream(OutputStream out, File f) throws IOException {  
        super(out);  
    }  
  
}  


测试方法: 
Java代码  
public static void writeObject() throws Exception {  
        String filename = "test.txt";  
        File f = new File(filename);  
        OutputStream os = new FileOutputStream(f, true);  
        MyObjectOutputStream moos = MyObjectOutputStream.newInstance(f, os);  
        moos.writeObject("abc");  
        moos.writeObject(1);  
        moos.close();  
    }  
分享到:
评论

相关推荐

    java 追加文件内容

    在Java编程语言中,追加文件内容是一项常见的任务,它涉及到对已有...总之,Java提供了多种方式来追加文件内容,开发者可以根据具体需求选择最适合的方法。无论选择哪种方式,确保正确处理异常和资源管理是至关重要的。

    个人资料Java io流

    对象流则用于序列化和反序列化Java对象,使得对象可以在内存间或者网络间传输。 此外,Java NIO(New IO)是Java 1.4引入的一个新模块,提供了非阻塞I/O操作,提高了性能,特别是在高并发场景下。NIO的核心概念包括...

    Java序列化多次追加到txt以及从txt反序列化

    Java序列化是Java平台提供的一种持久化对象的机制,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。在这个特定的场景中,我们关注的是如何使用Java序列化来多次追加对象到一个TXT文件,而不是覆盖...

    Java流操作文件

    在Java中,可以使用字节流或字符流实现文件复制。下面是一个使用`FileInputStream`和`FileOutputStream`的例子: ```java try (FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new ...

    java的io流文件读写

    5. 对象流(ObjectInputStream/ObjectOutputStream):用于序列化和反序列化对象。序列化可以将对象的状态保存到文件或网络中,反序列化则可以恢复对象的状态。 6. 文件复制:Java IO流常用于文件的复制。通过创建...

    java第4章 JAVA IO流

    在处理文件操作时,我们还会学到文件复制、文件追加、文件删除等操作,这些都是通过IO流实现的。例如,使用PipedInputStream和PipedOutputStream可以实现线程间的通信,而DataInputStream和DataOutputStream则支持...

    java文件流学习实验

    5. **对象序列化与反序列化**:Java的ObjectInputStream和ObjectOutputStream允许我们将Java对象写入到文件并从文件中读取,实现对象的持久化存储。 6. **转换流**:InputStreamReader和OutputStreamWriter用于在...

    java 输入输出流 实例

    Java提供了多种I/O流类来适应这些需求,如FileOutputStream的append()方法用于追加内容,DataInputStream和DataOutputStream用于处理基本数据类型,ObjectInputStream和ObjectOutputStream用于序列化和反序列化对象...

    Java分布式文件对象存储Minio框架并发上传、下载、合并、删除等操作示例Demo完整版

    Minio本身并不直接支持对象的合并操作,但可以通过Java代码实现。可以先下载目标对象到本地,然后将其他对象的内容追加到本地文件,最后再将合并后的文件上传为一个新的对象。 **4. 删除对象** 删除单个对象使用`...

    孙卫琴《Java面向对象编程》ppt 和源代码

    Java通过方法重写和向上转型实现多态。 2. **构造器** - **构造器**:用于初始化新创建的对象,与类名相同且无返回类型。通常在创建对象时调用构造器来设置初始状态。 3. **方法重载与覆盖** - **方法重载**:在...

    2020老杜最新Java零基础进阶视频教程-IO流课件

    ObjectInputStream和ObjectOutputStream支持对象的序列化和反序列化,允许我们将Java对象写入到流中,然后在另一端恢复为原始对象。 7. File类: File类是Java中处理文件和目录的工具类,提供了创建、删除、重命名...

    学生信息小程序(实现追加,读取的方法,java语言编写).docx

    这个Java程序设计了一个小型的学生信息管理小程序,主要实现了对学生信息的追加和读取功能。在Java编程中,文件操作是常见的任务,本程序通过`RandomAccessFile`类来实现对文件的追加写入和读取。以下是该程序涉及的...

    Java基础11-(字节流、字符流)

    在Java编程中,I/O(Input/...综上所述,Java的字节流和字符流是进行文件操作的基础,它们可以处理不同类型的数据,并且通过各种方法实现文件的读写操作。掌握它们的使用对于进行高效的文件处理和程序设计至关重要。

    java字节流和字符流

    Java中的字节流和字符流是IO操作中的两...流的关闭一般通过调用`close()`方法实现。在实际编程中,应该注意异常处理,特别是在涉及文件操作时,可能出现的`FileNotFoundException`和`IOException`等异常应当妥善处理。

    追加内容到文件末尾的几种常用方法-java.doc

    本文将详细介绍三种常用的Java方法来实现这一功能,并通过代码示例进行说明。 1. 使用`FileOutputStream` `FileOutputStream`是Java I/O流的基础类,用于处理与文件相关的输入/输出操作。当我们在构造`...

    基于JAVA的常用文件操作方法

    在提供的`FileUtil.java`文件中,可能包含了上述某些或全部的文件操作方法,具体实现需要查看源码才能得知。对于实际项目开发,编写一个`FileUtil`工具类是非常常见的做法,这样可以将文件操作封装起来,便于代码的...

    java IO 流详细分析

    Java IO流是进行文件读写操作的基础,通过对不同类型的流进行组合使用,可以实现复杂的文件处理任务。掌握Java IO流的基本概念和操作方法,对于开发高质量的应用程序至关重要。希望本文能帮助您更好地理解Java IO流...

    java字符流练习-电话本管理系统

    在这个名为"java字符流练习-电话本管理系统"的项目中,开发者使用了Java的字符流API来实现一个电话本管理的功能。电话本管理系统通常包括添加联系人、查找联系人、删除联系人等操作,这些功能的实现都需要对字符数据...

    java 面向对象程序设计全部课件各部分重点内容

    8. **文件输入输出**:Java的I/O流系统支持对文件的操作,包括读取、写入、复制、追加等。学习File类、InputStream/OutputStream及其子类,以及NIO(非阻塞I/O)的使用,能够处理各种文件操作需求。 9. **网络编程*...

    Java面向对象高级编程笔试考试题.doc

    本文档总结了 Java 面向对象高级编程笔试考试题的知识点,涵盖了面向对象编程的基本概念、字符串操作、异常处理、多态、线程、流等多个方面。 1. 面向对象的特征有哪些方面? 面向对象编程的四个基本特征是:抽象...

Global site tag (gtag.js) - Google Analytics