Java读取文本文件生成int数组全为0问题排查求助
问题原因分析
嘿,你的代码问题其实很典型——第一个while循环把文件内容全读完了,导致第二个循环根本没东西可读!
具体来说:
- 你第一个循环
while (scanner.hasNextLine())的作用是统计文件行数,但每次循环里都调用了scanner.nextLine(),这会让Scanner的读取指针一步步走到文件末尾。 - 当你进入第二个循环
while(scanner.hasNextInt())时,Scanner已经没有剩余内容了,所以这个循环一次都不会执行。而int数组初始化时,所有元素默认值都是0,这就是为什么你输出全是0的原因。
解决建议
这里给你两种可行的解决思路,按需选择:
思路1:重新创建Scanner(简单直接)
统计完行数后,关闭旧的Scanner,再新建一个指向同一个文件的Scanner,这样就能从文件开头重新读取数据:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class RadiationReader { public static void main (String[] args) throws FileNotFoundException { int radCtr = 0; Scanner scanner = new Scanner(new File("C:/Users/u23s57/Documents/4_22_18_radiation.txt")); // 统计行数 while (scanner.hasNextLine()) { radCtr++; scanner.nextLine(); } scanner.close(); // 关闭旧的Scanner,释放资源 // 重新初始化Scanner,从文件开头读取 Scanner newScanner = new Scanner(new File("C:/Users/u23s57/Documents/4_22_18_radiation.txt")); int [] radiation = new int [radCtr]; int i = 0; while(newScanner.hasNextInt()){ radiation[i++] = newScanner.nextInt(); } newScanner.close(); // 输出验证 for (int y = 0; y < radiation.length; y++) { System.out.println(radiation[y]); } int max = getMax(radiation); System.out.println("Maximum Value is: "+max); } // 假设你的getMax方法是这样实现的 private static int getMax(int[] arr) { int max = arr[0]; for (int num : arr) { if (num > max) max = num; } return max; } }
思路2:一次循环完成读取(更高效)
其实没必要先统计行数再读取,用ArrayList先临时存储所有整数,最后再转成int数组,这样只需要遍历文件一次,效率更高:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class RadiationReader { public static void main (String[] args) throws FileNotFoundException { Scanner scanner = new Scanner(new File("C:/Users/u23s57/Documents/4_22_18_radiation.txt")); List<Integer> radiationList = new ArrayList<>(); // 一次循环读取所有整数 while(scanner.hasNextInt()){ radiationList.add(scanner.nextInt()); } scanner.close(); // 将ArrayList转成int数组 int[] radiation = radiationList.stream().mapToInt(Integer::intValue).toArray(); // 输出验证 for (int num : radiation) { System.out.println(num); } int max = getMax(radiation); System.out.println("Maximum Value is: "+max); } private static int getMax(int[] arr) { int max = arr[0]; for (int num : arr) { if (num > max) max = num; } return max; } }
额外注意点
- 别忘了处理
FileNotFoundException:要么在main方法上声明throws FileNotFoundException,要么用try-catch包裹文件读取逻辑,否则代码编译会报错。 - 使用完Scanner后一定要调用
close(),避免文件资源泄漏。
内容的提问来源于stack exchange,提问作者Benjamin Pardue
相关产品推荐
相关产品推荐

