RandomAccessFile读取Book对象乱码问题排查(忽略无效while循环)
解决Book对象读取乱码问题
这明显是字符编码不匹配或者对象存储/读取方式错误导致的乱码问题,我帮你拆解根源和对应的解决方案:
根源分析
从你给出的乱码内容来看,要么是读取文件时用错了字符编码,导致文本被错误解析;要么是你错误地把对象的二进制序列化数据存成了txt文本文件,反过来读取时自然会出现无法识别的乱码。
解决方案
情况1:txt文件是纯文本格式存储Book属性
如果你的txt文件里是可读的文本内容(比如每行一个属性,或者JSON格式),那问题出在读取时的编码和写入时不一致。
解决步骤:
- 确保写入和读取文件时都使用相同的编码(推荐UTF-8,避免中文/特殊字符乱码)
- 读取文件时显式指定编码,而不是依赖系统默认编码
示例代码(以Java为例):
// 写入文本文件时指定UTF-8编码 try (PrintWriter writer = new PrintWriter("book.txt", StandardCharsets.UTF_8)) { writer.println("isbn=225346873945"); writer.println("price=12.99"); writer.println("yearPublished=2015"); writer.println("title='Finders Fee'"); } // 读取文本文件时同样指定UTF-8编码 try (BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream("book.txt"), StandardCharsets.UTF_8))) { Book book = new Book(); String line; while ((line = reader.readLine()) != null) { // 解析每行内容到Book对象 String[] parts = line.split("=", 2); if (parts.length != 2) continue; switch (parts[0]) { case "isbn": book.setIsbn(parts[1]); break; case "price": book.setPrice(Double.parseDouble(parts[1])); break; case "yearPublished": book.setYearPublished(Integer.parseInt(parts[1])); break; case "title": book.setTitle(parts[1].replace("'", "")); break; } } System.out.println(book); }
情况2:你用二进制序列化方式存储Book对象
如果是直接把Book对象通过序列化(比如Java的ObjectOutputStream)写入文件,却用txt作为后缀,这种方式本身就错误——二进制数据不是文本,存到txt会被系统转码,读取时必然乱码。
解决步骤:
- 改用二进制文件存储(比如后缀
.dat) - 读取时用对应的反序列化流读取
示例代码(以Java为例):
// 序列化Book对象到二进制文件 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("book.dat"))) { Book book = new Book("225346873945", 12.99, 2015, "Finders Fee"); oos.writeObject(book); } // 反序列化读取Book对象 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("book.dat"))) { Book book = (Book) ois.readObject(); System.out.println(book); }
关键提醒
- 先确认你的txt文件到底是纯文本还是二进制数据:打开txt文件,如果能看到可读的属性内容,用情况1的方案;如果是一堆乱码,那大概率是二进制序列化数据,改用情况2的方案。
- 永远显式指定文件编码,不要依赖系统默认编码(不同系统默认编码可能不同,比如Windows是GBK,Linux/macOS是UTF-8)。
内容的提问来源于stack exchange,提问作者Sam Roehrich
相关产品推荐
相关产品推荐

