You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:56:59