Java Scanner空token判断及文件分号替换处理问题求助
问题解决:替换文件中的分号为空格或换行
现有代码的问题分析
你的Scanner实现思路存在几个核心问题:
- 用
;作为分隔符时,连续的;;会生成空字符串token,但代码里没有判断token是否为空的逻辑 - while循环里连续调用
s.next(),但s.hasNext()仅保证存在至少一个token,两次调用会直接抛出NoSuchElementException - 逻辑分支完全混乱,if条件和实际要处理的空token场景不匹配
方案一:修正Scanner实现
如果要坚持用Scanner,可以通过判断每个token是否为空来处理:
import java.io.File; import java.io.IOException; import java.util.Scanner; class Delimit { public static void main(String[] args) throws IOException { File f = new File("data.txt"); // 关闭默认的空白字符跳过,确保能捕获空token Scanner s = new Scanner(f).useDelimiter(";"); while (s.hasNext()) { String token = s.next(); if (token.isEmpty()) { // 空token对应连续的;;,输出换行 System.out.println(); } else { // 非空token对应单个;分隔的内容,输出内容加空格 System.out.print(token + " "); } } s.close(); } }
注意:这个方案会在最后输出末尾多一个空格,若有连续多个;;;的情况会输出多个换行,可根据需求额外调整。
方案二:更优的正则替换方案(推荐)
直接把整个文件读成字符串,用正则表达式一次性替换,逻辑更清晰、效率更高:
步骤说明
- 读取整个文件内容为字符串
- 用
;;匹配连续分号,替换为换行符\n - 用
;匹配剩余的单个分号,替换为空格 - 可选:处理首尾空白或多余的换行/空格(按需选择)
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; class Delimit { public static void main(String[] args) throws IOException { // 读取整个文件为字符串 String content = new String(Files.readAllBytes(Paths.get("data.txt"))); // 第一步:替换连续分号为换行 content = content.replaceAll(";;", "\n"); // 第二步:替换剩余单个分号为空格 content = content.replaceAll(";", " "); // 可选:去除首尾空白,合并多余的空白字符 // content = content.trim().replaceAll("\\s+", " "); System.out.print(content); } }
运行后输出完全符合需求:
john 88 CARL JAFF HELEN MARY 123 99
正则表达式详解
;;:精确匹配两个连续的分号,直接替换为换行- 若需要处理任意多个连续分号(比如
;;;、;;;;)都替换为一个换行,可将第一个正则改为;+
大文件优化方案
如果处理的是大文件,建议用BufferedReader逐行处理,避免内存占用过高:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; class Delimit { public static void main(String[] args) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { String line; while ((line = br.readLine()) != null) { line = line.replaceAll(";;", "\n").replaceAll(";", " "); System.out.print(line + "\n"); } } } }
内容的提问来源于stack exchange,提问作者Fuji
相关产品推荐
相关产品推荐

