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
相关产品推荐
相关产品推荐

