如何使用Scanner从混合内容文件中提取纯字符串并写入新文件
解决方法:修正纯字符串判断逻辑
我来帮你搞定这个问题!你当前的esString方法完全起不到过滤作用——因为任何String对象调用toString()返回的都是它本身,所以这个判断永远会返回true,根本没法区分纯字符串和数字类内容。
核心思路
我们需要反过来判断:如果一个字符串无法被解析为整数或浮点数,那它就是我们要保留的纯字符串。可以通过异常捕获的方式实现这个判断——尝试把字符串解析为数字,成功则说明是数字(过滤),失败则说明是纯字符串(保留)。
修正后的完整代码
import java.io.File; import java.io.FileNotFoundException; import java.util.Locale; import java.util.Scanner; import java.io.PrintWriter; public class StringExtractor { public static void buscarFichero(String ftx) { File f = new File(ftx); Scanner s = null; PrintWriter p = null; try { s = new Scanner(f).useLocale(Locale.US); p = new PrintWriter(ftx + "_nuevo"); while (s.hasNextLine()) { String aux = s.nextLine(); if (esString(aux)) { // 简化判断写法,无需==true String b = aux.trim(); p.println(b); } } } catch (FileNotFoundException e) { // 添加异常打印,方便调试文件找不到的问题 e.printStackTrace(); } finally { if (s != null) { s.close(); } if (p != null) { p.close(); } } } public static boolean esString(String x) { String trimmedStr = x.trim(); // 处理空白行:若不需要保留空行则返回false,需要则返回true if (trimmedStr.isEmpty()) { return false; } // 尝试解析为整数 try { Integer.parseInt(trimmedStr); return false; } catch (NumberFormatException e) { // 整数解析失败,尝试解析浮点数 try { Double.parseDouble(trimmedStr); return false; } catch (NumberFormatException ex) { // 两种数字类型都解析失败,判定为纯字符串 return true; } } } }
关键说明
esString方法逻辑:- 先对字符串做trim处理,避免空白字符干扰数字解析
- 先尝试解析整数,失败后再尝试解析浮点数
- 若两种解析都失败,判定为纯字符串返回
true;否则返回false(过滤数字内容)
额外优化点:
- 简化了原代码中冗余的
if(esString(aux) == true)写法 - 给异常捕获块添加了打印逻辑,方便排查文件读取异常
- 简化了原代码中冗余的
自定义调整:
- 如果需要保留空白行,只需把
trimmedStr.isEmpty()的返回值改为true - 对于包含部分数字但非纯数字的内容(比如
"abc123"),该方法会正确保留,因为这类字符串无法被解析为纯数字
- 如果需要保留空白行,只需把
内容的提问来源于stack exchange,提问作者Daniel López
相关产品推荐
相关产品推荐

