在文件末尾追加对象
用对象流写到文件中时,首先会将对象信息写到文件头才开始写具体数据.每次追加的时候也是同样.这就造成了之后读取文件的时候无法正常读取.
java帮我们读的时候只会过滤掉第一次的头部信息,之后的它没法识别.
解决办法有二:
文件较小的时候,不追加.可以先读出所有的对象,将要追加的加在后面再重新写一遍.(文件更小)
文件较大的时候,直接在后面追加.跳过头部信息不写出去了.(效率更高)
public static void read(String str) { File file = new File(str); try { FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); User us = (User) ois.readObject(); while (us != null) { Server.allUser.put(us.num, us); us = (User) ois.readObject(); } ois.close(); System.out.println(Server.allUser); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void saveAll(String str) { File file = new File(str); try { FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); Set<Integer> set = Server.allUser.keySet(); for (int i : set) { oos.writeObject(Server.allUser.get(i)); } oos.flush(); oos.close(); } catch (IOException e) { e.printStackTrace(); } }
如上面这两个方法,一个是读取文件中的User对象,一个是将User写到文件中.这个无需过多解释
再看之后的追加办法:
public static void save(String str, User user) { File file = new File(str); try { FileOutputStream fos = new FileOutputStream(file, true); MyObjectWrite oos = new MyObjectWrite(fos); // 由于需要在static中创建,所以MyObjectWrite为static oos.writeObject(user); oos.flush(); oos.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 重写对象输出流,不让它写头文件 * * @author Huangbin * */ static class MyObjectWrite extends ObjectOutputStream { public MyObjectWrite(OutputStream out) throws IOException { super(out);// 会调用writeStreamHeader() } @Override protected void writeStreamHeader() throws IOException { super.reset(); } }
new FileOutputStream(file, true);
true表示是追加.
这里我们要重写ObjectOutputStream中的writeStreamHeader方法.
因为ObjectOutputStream在writeObject的时候回调用这个方法写头信息.我们重写这个方法,不让它写头信息.这样就实现了目的了.
将 super.reset();改为super.writeStreamHeader();就会写头信息了.
相关推荐
Java序列化是Java平台提供的一种...通过使用`ObjectOutputStream`和`ObjectInputStream`,我们可以方便地将对象写入和读取文件,尤其是在需要追加多个对象到同一个文件时。同时,确保处理好异常,以确保程序的健壮性。
7. 文件追加:如果希望在文件末尾追加内容,而不是覆盖原有内容,可以在创建FileOutputStream时传入true作为第二个参数,或者使用FileAppender类。 8. 异常处理:在进行文件读写时,必须处理IOException。这是一种...
- **ObjectInputStream**和**ObjectOutputStream**:它们允许将Java对象写入到文件中,实现对象的持久化,以及从文件中读取对象。 7. **文件复制** - Java中常见的文件复制方法包括使用`FileInputStream`和`...
如果需要在文件末尾添加内容,可以使用`FileOutputStream`的构造函数传入`true`参数,即`new FileOutputStream(file, true)`,这将使流处于追加模式。 5. **随机访问文件** `RandomAccessFile`类允许在文件的任意...
- **追加模式**:在写入文件时,使用`FileWriter(File file, boolean append)`的构造函数,设置append为true,可以将内容追加到文件末尾,而不是覆盖原有内容。 4. **输入/输出流**: - `InputStream`和`...
3. 文件追加:使用FileWriter的append()方法可以在文件末尾添加内容。 4. 文件流的关闭:始终确保在完成操作后关闭流,防止资源泄漏。try-with-resources语句可以简化资源管理。 四、NIO(New IO) Java 1.4引入了...
ObjectOutputStream和ObjectInputStream允许我们将Java对象序列化为字节流,然后保存到文件或通过网络发送,ObjectInputStream则可以将字节流反序列化回对象。 **7. 文件复制** Java IO提供了简单的方法来实现文件...
Java的输入输出流是Java IO体系中的核心概念,主要用于数据的传输。在Java中,流分为字节流和字符流两大类,它们都是抽象...在处理文件操作时,还需考虑文件的读写模式(如追加或覆盖)和异常处理,确保数据的安全性。
- 构造方法:`FileWriter(String filename, boolean append)`,若`append`为`true`,则在文件末尾追加数据。 - 方法: - `void write(int c)`:写入单个字符。 - `void write(char[] cbuf)`:写入字符数组。 - ...
5. **文件追加**:如果想在文件末尾添加内容而不是覆盖原有内容,可以使用`FileWriter`的构造函数传入`true`参数,或者使用`FileOutputStream`的`append()`方法。 6. **异常处理**:在进行文件操作时,应始终处理...
- 如果想在文件末尾追加内容,可以使用`FileWriter`的构造函数传入`true`参数。 9. **异常处理** - 文件操作可能会抛出各种`IOException`,因此通常需要进行异常处理,使用`try-catch`语句块。 10. **文件监控**...