`

ObjectOutputStream在文件末尾追加对象

阅读更多

在文件末尾追加对象

 

用对象流写到文件中时,首先会将对象信息写到文件头才开始写具体数据.每次追加的时候也是同样.这就造成了之后读取文件的时候无法正常读取.

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();就会写头信息了.

 

 

 

0
0
分享到:
评论

相关推荐

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

    Java序列化是Java平台提供的一种...通过使用`ObjectOutputStream`和`ObjectInputStream`,我们可以方便地将对象写入和读取文件,尤其是在需要追加多个对象到同一个文件时。同时,确保处理好异常,以确保程序的健壮性。

    java的io流文件读写

    7. 文件追加:如果希望在文件末尾追加内容,而不是覆盖原有内容,可以在创建FileOutputStream时传入true作为第二个参数,或者使用FileAppender类。 8. 异常处理:在进行文件读写时,必须处理IOException。这是一种...

    Java文件输入输出汇总

    - **ObjectInputStream**和**ObjectOutputStream**:它们允许将Java对象写入到文件中,实现对象的持久化,以及从文件中读取对象。 7. **文件复制** - Java中常见的文件复制方法包括使用`FileInputStream`和`...

    Android 文件IO操作

    如果需要在文件末尾添加内容,可以使用`FileOutputStream`的构造函数传入`true`参数,即`new FileOutputStream(file, true)`,这将使流处于追加模式。 5. **随机访问文件** `RandomAccessFile`类允许在文件的任意...

    java文件操作

    - **追加模式**:在写入文件时,使用`FileWriter(File file, boolean append)`的构造函数,设置append为true,可以将内容追加到文件末尾,而不是覆盖原有内容。 4. **输入/输出流**: - `InputStream`和`...

    java io 系列操作代码练习 Java学习资料

    3. 文件追加:使用FileWriter的append()方法可以在文件末尾添加内容。 4. 文件流的关闭:始终确保在完成操作后关闭流,防止资源泄漏。try-with-resources语句可以简化资源管理。 四、NIO(New IO) Java 1.4引入了...

    java IO基础

    ObjectOutputStream和ObjectInputStream允许我们将Java对象序列化为字节流,然后保存到文件或通过网络发送,ObjectInputStream则可以将字节流反序列化回对象。 **7. 文件复制** Java IO提供了简单的方法来实现文件...

    Java 字节流、字符流题目.pdf

    Java的输入输出流是Java IO体系中的核心概念,主要用于数据的传输。在Java中,流分为字节流和字符流两大类,它们都是抽象...在处理文件操作时,还需考虑文件的读写模式(如追加或覆盖)和异常处理,确保数据的安全性。

    IO流宝典

    - 构造方法:`FileWriter(String filename, boolean append)`,若`append`为`true`,则在文件末尾追加数据。 - 方法: - `void write(int c)`:写入单个字符。 - `void write(char[] cbuf)`:写入字符数组。 - ...

    CECS277-Project-File-I-O:CECS277 作业 3. 文件读写

    5. **文件追加**:如果想在文件末尾添加内容而不是覆盖原有内容,可以使用`FileWriter`的构造函数传入`true`参数,或者使用`FileOutputStream`的`append()`方法。 6. **异常处理**:在进行文件操作时,应始终处理...

    Save

    - 如果想在文件末尾追加内容,可以使用`FileWriter`的构造函数传入`true`参数。 9. **异常处理** - 文件操作可能会抛出各种`IOException`,因此通常需要进行异常处理,使用`try-catch`语句块。 10. **文件监控**...

Global site tag (gtag.js) - Google Analytics