Java Scanner读取首行含数字拼接字符串的TXT文件无下一行问题
问题分析与解决方案
核心原因
问题出在Java Scanner的默认分隔符逻辑和错误的判断逻辑组合上:
- Scanner默认把所有空白字符(空格、制表符、换行)当成分隔符,而非你需要的仅制表符。当文件开头行是数字拼接字符串(比如
123Switch这类格式),Scanner会把它拆成数字和字符串两部分,直接打乱了行的完整性。 - 你尝试的
hasNextInt()||hasNextLine()判断逻辑会触发错误:当hasNextInt()检测到开头的数字时,会调用nextInt()读取数字部分,此时输入流指针停在数字后的字符串位置,后续nextLine()只能读取该行剩余的内容,而非完整行,最终导致hasNextLine()误判为没有更多行。
修复方案
方案1:强制指定Scanner的分隔符
把Scanner的分隔符设置为仅识别制表符\t和换行符\n,确保每行是独立单元,字段间用制表符分隔:
Scanner scanner = new Scanner(new File("your-file-path.txt")); // 设置分隔符为制表符或换行 scanner.useDelimiter("\\t|\\n");
方案2:逐行读取+拆分(更稳定)
放弃nextXxx()系列方法,先读取整行再拆分字段,彻底规避分隔符错位问题:
List<Game> gameList = new LinkedList<>(); try (Scanner scanner = new Scanner(new File("your-file-path.txt"))) { // 跳过表头(如果文件有表头的话) if (scanner.hasNextLine()) { scanner.nextLine(); } while (scanner.hasNextLine()) { String line = scanner.nextLine().trim(); if (line.isEmpty()) continue; // 跳过空行 String[] fields = line.split("\\t"); // 确保字段数量符合要求 if (fields.length >= 2) { String name = fields[0]; String console = fields[1]; gameList.add(new Game(name, console)); } } } catch (FileNotFoundException e) { e.printStackTrace(); }
方案3:避免混合使用nextXxx()和nextLine()
如果必须用nextXxx()方法,每次调用nextInt()/next()后必须调用scanner.nextLine()清空残留的换行符,否则后续nextLine()会读取空行:
// 错误示例:读取数字后未清空换行符 if (scanner.hasNextInt()) { int num = scanner.nextInt(); // 这里会残留换行符,导致nextLine()读取空行 String line = scanner.nextLine(); } // 正确示例:读取数字后手动清空换行符 if (scanner.hasNextInt()) { int num = scanner.nextInt(); scanner.nextLine(); // 清空换行符 String line = scanner.nextLine(); }
额外检查项
- 确认文件编码:确保文件是UTF-8或Java支持的编码,避免乱码导致Scanner误判行结束。
- 兼容换行符:部分Windows生成的文件用
\r\n作为换行符,可以把拆分逻辑改成line.split("\\t|\\r?\\n")来兼容。
内容的提问来源于stack exchange,提问作者bladeart0-0
相关产品推荐
相关产品推荐

