Java读取不同长度逗号分隔文本文件时行剩余元素读取问题
问题根因
- 全局仅实例化了一次
limits列表,所有行的剩余元素都会累加进同一个列表,不会自动清空上一行数据 - Scanner仅设置逗号为分隔符时,换行符会被视为普通字符,内层
while (inputFile.hasNext())会直接读取到整个文件结束才停止,不会停在当前行末尾
修正后代码
ArrayList<Import> imports = new ArrayList<Import>(); File myfile = new File("file.txt"); try { Scanner inputFile = new Scanner(myfile); // 先逐行读取,避免跨行读取问题 while (inputFile.hasNextLine()) { String line = inputFile.nextLine(); // 跳过空行 if (line.trim().isEmpty()) continue; // 拆分当前行的所有逗号分隔元素 String[] items = line.split(","); // 读取前4个固定字段 int ID = Integer.parseInt(items[0]); int spareID = Integer.parseInt(items[1]); String date = items[2]; float fee = Float.parseFloat(items[3]); // 每次处理新行都创建新的limits列表 ArrayList<String> limits = new ArrayList<String>(); // 读取fee之后的剩余元素,仅读取当前行的内容 for (int i = 4; i < items.length; i++) { limits.add(items[i]); } Import importObj = new Import(ID, spareID, fee, date, limits); imports.add(importObj); } inputFile.close(); } catch (FileNotFoundException e) { System.out.println("error: can not find file"); }
核心修改说明
- 改为先读取整行再拆分的逻辑,从根源上避免跨行读取的问题
- 将
limits的实例化移到行循环内部,每行处理时都用全新的空列表存储数据,不会和其他行的数据混淆 - 修复了原代码中
SpareID变量名大小写不匹配、泛型声明Imports和实际类名Import不一致的问题
内容的提问来源于stack exchange,提问作者william_
相关产品推荐
相关产品推荐

