Java实现独立文件读取存双数组功能时仅输出最后一行内容的问题排查
问题定位与修复方案
当前代码无法全量打印文件内容,是两处独立逻辑bug叠加导致的,文件读取的主解析流程本身没有错误:
- 第一处bug:主方法的字符串拼接逻辑完全失效,每次循环都覆盖之前的内容
你在主方法中的循环代码片段:
for (i = 0; i < pName.length; i++) { outputStr = pName[i] + "," + pPrice[i] + "\n"; }
循环内直接对outputStr做赋值操作,没有追加之前的内容,相当于反复擦写纸面,最后变量里只会留存最后一次循环生成的单行字符串。你现在能看到文件最后一行产品内容,本质是循环停在了有效数据的末尾位置,并没有遍历完全部数组长度。
因为你预设的数组长度为50,实际文件只有3条有效数据,后续47个数组元素是Java默认值:pName对应null,pPrice对应0.0,如果循环跑完全程,最后输出的会是null,0.0这类无效内容,而非有效数据的最后一行。
- 第二处bug:没有把实际读取的有效数据条数传回主方法
你在readFromFile方法里用局部变量i统计读入的产品数量,但这个变量是方法内部的临时变量,方法运行结束就会被销毁,主方法完全不知道实际读入了多少条数据,只能盲目遍历整个50长度的数组,既会混入大量无效空值,也没法控制遍历的边界。
优化点补充
- 文件读取方法中创建的Scanner对象,在读取完成后没有调用
sc.close()关闭,存在文件句柄资源泄露,属于代码规范问题 - 你设置的分隔符
",|\r\n"可以正常匹配示例文件的逗号、换行分隔规则,读取解析逻辑本身不需要调整
修正后的参考实现
主方法核心逻辑
// 按预设长度初始化数组 pPrice = new double[50]; pName = new String[50]; int validCount = 0; StringBuilder outputBuilder = new StringBuilder(); try { // 接收文件读取方法返回的有效数据条数 validCount = readFromFile(pName, pPrice, "products.txt"); } catch (FileNotFoundException e) { JOptionPane.showMessageDialog(null, "File cannot be read"); e.printStackTrace(); } // 仅遍历有实际数据的数组范围 for (i = 0; i < validCount; i++) { outputBuilder.append(pName[i]).append(",").append(pPrice[i]).append("\n"); } // 对两个数组完成排序后调用展示方法 display(outputBuilder.toString());
文件读取方法修正
public static int readFromFile(String[] pName, double[] pPrice, String fileName) throws FileNotFoundException { File file = new File(fileName); Scanner sc = new Scanner(file); sc.useDelimiter(",|\r\n"); int i = 0; while (sc.hasNext()) { String name = sc.next(); String cost = sc.next(); pName[i] = name; pPrice[i] = Double.parseDouble(cost); i++; } // 关闭文件扫描器,释放资源 sc.close(); // 返回实际读取的有效数据条数 return i; }
按上述修正逻辑运行,即可完整打印文件内的全部产品数据,不会再出现仅显示最后一行的问题。
内容的提问来源于stack exchange,提问作者Lydia Bultemeyer
相关产品推荐
相关产品推荐

