Java使用Scanner读取文件时出现NoSuchElementException问题求助
问题分析与解决方案
可能的原因及对应解决方法
1. 文件编码不匹配
Scanner默认采用平台默认编码读取文件,若你的.txt文件使用了其他编码(如UTF-16、GBK等非平台默认编码),会导致Scanner无法正确解析文件内容,误判为无行可读。
解决方法:创建Scanner时指定文件编码,比如文件是UTF-8编码:
Scanner myReader = new Scanner(myObj, "UTF-8");
若是UTF-16编码:
Scanner myReader = new Scanner(myObj, "UTF-16");
2. 文件内容格式异常
文件虽为制表符分隔,但如果换行符不是Scanner默认识别的格式(比如仅用\r而非\n或\r\n),或是文件开头存在BOM头这类不可见特殊字符,会导致Scanner无法正确识别行边界。
解决方法:
- 检查并统一文件换行符为
\n或\r\n; - 若为UTF-8 BOM头问题,可改用
BufferedReader读取:
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(myObj), "UTF-8")); String header = reader.readLine();
3. Scanner分隔符干扰
Scanner默认分隔符包含空白字符(制表符、空格、换行等),虽hasNextLine()按行判断,但极端情况下文件内容全被识别为分隔符,也会出现误判。可尝试明确设置行分隔符:
myReader.useDelimiter(System.lineSeparator());
4. 文件权限不足
即便文件路径正确且非空,当前运行Java程序的用户可能没有该文件的读取权限,导致Scanner无法读取内容。
解决方法:检查文件读取权限,确保运行程序的用户拥有读取该文件的权限。
验证代码建议
先用极简代码读取文件,排除复杂逻辑干扰:
import java.io.File; import java.io.FileReader; import java.io.BufferedReader; public class TestReadFile { public static void main(String[] args) { try { File file = new File("C:\\Daten\\workspaces\\my_file.txt"); BufferedReader br = new BufferedReader(new FileReader(file)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } catch (Exception e) { e.printStackTrace(); } } }
若这段代码能正常输出内容,说明问题出在原代码的Scanner使用上;若仍无法读取,则大概率是编码或权限问题。
内容的提问来源于stack exchange,提问作者Martin Specker
相关产品推荐
相关产品推荐

