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

Java如何读取文本文件拆分内容后存入图书对象数组

问题原因

代码无法运行是几个基础逻辑错误导致的:

  • 对BufferedReader.readLine()的行为理解错误:这个方法每次调用只返回文件里的单行内容,遇到换行就截断返回,不会一次性读完整本书的所有信息。你在循环里每次拿到的line只是单个字段行(比如单独的ISBN行、单独的作者行),或者是两本书之间的空行,根本不可能一次拆出8个图书字段。
  • 拆分逻辑写错:你写的split("//n ")是匹配字面量字符串/n ,根本不是换行符;就算写对换行符,在逐行读取的逻辑里也用不上。
  • 字段解析有语法错误和索引错误:pages = bookText[5].split(": ")这行没取拆分后的第二个元素,也没做类型转换;跳过了索引位置6的price字段直接取索引7,字段对应关系完全错位;变量名itemesInStock存在拼写错误。
  • 没处理两本图书之间的空分隔行:读到空行时执行拆分逻辑会直接触发数组下标越界异常。
  • 流资源关闭逻辑有缺陷:如果读取过程中抛出异常,reader.close()不会被执行,会造成文件资源泄漏。
正确实现思路

逐行读取时,用临时变量存储当前正在解析的图书字段,每读完8个有效字段(凑齐一本完整图书的信息),就把对象存入数组,遇到空行直接跳过,直到文件读完。用try-with-resources语法自动关闭文件流,不用手动写close逻辑。

修正后的可运行代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BookParser {
    public static void main(String[] args) {
        BookClass[] bookArray = new BookClass[10];
        int counter = 0;
        // 临时变量存储当前解析的图书字段
        String ISBN = null;
        String category = null;
        String author = null;
        String title = null;
        String language = null;
        int pages = 0;
        int price = 0;
        int itemsInStock = 0;
        // 标记当前已经读到了一本图书的第几个字段
        int fieldCount = 0;

        // try-with-resources 自动关闭流,避免资源泄漏
        try (BufferedReader reader = new BufferedReader(new FileReader("books.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                line = line.trim();
                // 跳过空分隔行
                if (line.isEmpty()) {
                    continue;
                }
                // 拆分键值对,兼容冒号后无空格的格式
                String[] keyValue = line.split(":");
                String key = keyValue[0].trim();
                String value = keyValue[1].trim();

                switch (key) {
                    case "ISBN":
                        ISBN = value;
                        fieldCount++;
                        break;
                    case "category":
                        category = value;
                        fieldCount++;
                        break;
                    case "author":
                        author = value;
                        fieldCount++;
                        break;
                    case "title":
                        title = value;
                        fieldCount++;
                        break;
                    case "language":
                        language = value;
                        fieldCount++;
                        break;
                    case "pages":
                        pages = Integer.parseInt(value);
                        fieldCount++;
                        break;
                    case "price":
                        price = Integer.parseInt(value);
                        fieldCount++;
                        break;
                    case "itemsInStock":
                        itemsInStock = Integer.parseInt(value);
                        fieldCount++;
                        break;
                }

                // 凑齐8个字段即完成单本图书解析
                if (fieldCount == 8) {
                    BookClass bookObj = new BookClass(ISBN, category, author, title, language, pages, price, itemsInStock);
                    bookArray[counter] = bookObj;
                    counter++;
                    // 重置计数器,准备解析下一本
                    fieldCount = 0;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 配套BookClass类参考,保证构造方法参数顺序对应即可
class BookClass {
    private String ISBN;
    private String category;
    private String author;
    private String title;
    private String language;
    private int pages;
    private int price;
    private int itemsInStock;

    public BookClass(String ISBN, String category, String author, String title, String language, int pages, int price, int itemsInStock) {
        this.ISBN = ISBN;
        this.category = category;
        this.author = author;
        this.title = title;
        this.language = language;
        this.pages = pages;
        this.price = price;
        this.itemsInStock = itemsInStock;
    }

    // 自行补充getter/setter方法
}
注意事项
  • 拆分键值对时用split(":")再对值做trim,是为了兼容文件里itemsInStock:24这类冒号后没有空格的行,避免拆分后数组长度不足触发越界。
  • 按键名匹配字段的方式容错率更高,就算后续文件里字段顺序调整,也不会出现解析错位的问题。

内容的提问来源于stack exchange,提问作者Bella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:18:15