Java序列化HashMap<UUID,ArrayList<String>>时无报错但文件未写入内容
问题排查和解决方案
1. 优先排查:是否误判文件内容为空
序列化后的文件是二进制格式,直接用普通文本编辑器(比如Windows记事本、部分轻量编辑器)打开时,因为包含大量不可打印的二进制字符,会显示为空白内容,属于正常现象。
你可以先查看文件的属性确认文件大小:
- 如果文件大小大于0,说明写入操作已经成功,只是查看方式不对,用反序列化代码即可读回内容。
- 如果文件大小确实为0,再继续往下排查。
2. 主动刷入缓冲区避免IO缓存问题
虽然ObjectOutputStream的close()方法默认会触发flush操作,但部分特殊文件系统/IO场景下可能存在缓冲区未写入的问题,可以在writeObject之后主动调用flush:
oos.writeObject(serializable); oos.flush(); // 新增主动刷入 oos.close(); fos.close();
3. 确认查看的文件和实际写入路径一致
如果使用相对路径创建File对象,不同运行环境的工作目录可能不同,会导致你查看的是其他目录下旧的空文件,和实际写入的文件不是同一个。
可以直接打印file.getAbsolutePath()输出绝对路径,按这个路径去找文件,避免路径混淆。
4. 多线程操作导致的内容丢失
如果序列化操作和其他修改HashMap的操作在并发执行,可能存在执行writeObject时恰好被其他线程清空了HashMap,之后其他线程又恢复了内容,导致你打印的对象看起来有内容,但实际写入的是空对象。可以加锁保证序列化期间HashMap不会被修改。
验证方法
可以在序列化完成后立刻加一段反序列化代码,直接验证写入的文件是否有效:
try { FileInputStream fis = new FileInputStream(file.getAbsolutePath()); ObjectInputStream ois = new ObjectInputStream(fis); HashMap<UUID, ArrayList<String>> readMap = (HashMap<UUID, ArrayList<String>>) ois.readObject(); System.out.println("反序列化得到的Map大小:" + readMap.size()); System.out.println("反序列化得到的Map内容:" + readMap); ois.close(); fis.close(); } catch (Exception e) { e.printStackTrace(); }
如果这段代码可以正常输出你写入的Map内容,说明序列化操作完全正常,不需要调整代码。
内容的提问来源于stack exchange,提问作者1Mangomaster1
相关产品推荐
相关产品推荐

