Java读取|分隔符格式文本存入ArrayList的代码修改求助
代码修改逻辑
- 读取到整行文本后,先清理行尾的
;结束符,避免最后一条条目解析出现脏数据 - 调用
split("\\|")按|分割整行得到所有独立人员条目(|为正则特殊字符,需要双反斜杠转义) - 遍历每条人员条目,单独按逗号分割提取三个字段,封装为Persona对象存入列表
- 原代码中
showMenuOptions()放在读行循环内会重复触发,建议调整到所有数据解析完成后执行
修改后代码
public void readFile() { String lineas; try { InputStream fileInputStream = new FileInputStream("datos.txt"); InputStreamReader reader = new InputStreamReader(fileInputStream, Charset.forName("UTF-8")); BufferedReader br = new BufferedReader(reader); while((lineas = br.readLine()) != null) { // 清理行尾分号,按|分割所有人员条目 lineas = lineas.trim().replaceAll(";$", ""); String[] personEntries = lineas.split("\\|"); // 遍历单条人员条目解析字段 for (String entry : personEntries) { String[] valor = entry.split(","); String name = valor[0]; int age = Integer.parseInt(valor[1]); int height = Integer.parseInt(valor[2]); persona.add(new Persona(name, age, height)); } } // 所有数据加载完成后再展示菜单 showMenuOptions(); br.close(); } catch (FileNotFoundException ex) { System.out.println("File Not Found."); } catch (IOException ex) { System.out.println("Can't open the File."); } catch (NumberFormatException ex) { System.out.println("数据格式错误,年龄或身高字段解析失败:" + ex.getMessage()); } }
可选优化:可以使用Java 7及以上支持的try-with-resources语法自动管理IO流,无需手动编写close逻辑,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Joseph Gonzalez
相关产品推荐
相关产品推荐

