Java Scanner next()方法反向操作?读取文件创建Employee对象遇错求助
解决文件读取创建Employee对象的问题
需求与文件内容
需求:
- 读取文件数据,使用四参构造器创建
Employee对象并打印 - 遇到行内容为
Default时,使用无参构造器创建默认对象并打印
文件内容:
Baha Uysal,1008,Yönetim,CEO Can Uysal,1511,IT,Web Developer Estus Candy,4949,Muhasebe,Müşavir Default İlis Kerhan,3535,Pazarlama,Negotiator
原代码问题分析
原代码存在以下关键问题:
- 字符串比较使用
!=,这是引用比较而非内容比较,无法正确判断是否为Default nextLine()调用后Scanner指针已移动到下一行,后续next()会跳过当前行剩余内容,导致数据读取错位- 重复调用
useDelimiter(),每次调用都会重置Scanner的分隔符逻辑,属于冗余操作
修正后的代码
public static void main(String[] args) throws FileNotFoundException { Scanner fileIn = new Scanner(new FileInputStream("C:\\Users\\Can\\Desktop\\girdiQuiz1.txt")); while (fileIn.hasNextLine()) { // 读取整行并去除首尾空白,避免换行符或空格干扰判断 String currentLine = fileIn.nextLine().trim(); if ("Default".equals(currentLine)) { // 创建默认Employee对象并打印 Employee defaultWorker = new Employee(); System.out.println(defaultWorker); } else { // 用单独的Scanner处理当前行的字段分割 Scanner lineParser = new Scanner(currentLine).useDelimiter(","); String name = lineParser.next().trim(); int id = lineParser.nextInt(); String department = lineParser.next().trim(); String position = lineParser.next().trim(); Employee worker = new Employee(name, id, department, position); System.out.println(worker); lineParser.close(); } } fileIn.close(); }
代码说明
- 整行读取判断:先读取完整一行内容,避免Scanner指针错位问题,同时用
trim()处理行首尾的空白字符 - 正确字符串比较:使用
"Default".equals(currentLine)进行内容比较,避免空指针风险 - 逐行字段解析:对非Default行,用独立的Scanner分割字段,逻辑清晰且不影响主Scanner的读取流程
关于反向next()的问题
Java的Scanner没有提供反向回退指针的方法,因为它基于输入流实现,输入流是单向只读的,无法回溯。解决这类问题的常规思路是提前将需要处理的内容读取到内存中(比如读取整行、读取所有内容到字符串),再进行解析,避免依赖输入流的指针移动。
内容的提问来源于stack exchange,提问作者Can
相关产品推荐
相关产品推荐

