读取浮点型数组格式文本文件时触发InputMismatchError的问题求助
解决Java读取浮点数组文本文件时的InputMismatchError问题
嘿,我来帮你分析下代码里的问题,以及如何修复这个读取浮点数组文件的逻辑:
问题根源
你的代码触发InputMismatchError主要有两个原因:
- 格式与Scanner默认分隔符不兼容:你的文件内容是带方括号
[]和逗号,的数组格式,但Scanner默认只会以空白字符作为分隔符。当它读到[、,、]这些非浮点数字符时,自然无法解析成float类型,直接抛出输入不匹配异常。 - 重复调用
nextFloat()导致逻辑混乱:循环里你连续调用了两次scanner.nextFloat(),这意味着每次循环会跳过一个元素(第一次读一个值,第二次直接读下一个),不仅会导致数据处理不全,还会在最后一次循环时因为没有剩余元素而抛出异常。
修复方案
这里提供两种可行的修复方式,你可以根据需求选择:
方法一:修改Scanner分隔符,适配数组格式
通过自定义分隔符,让Scanner忽略方括号、逗号和空白字符,直接提取浮点数:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class FloatArrayReader { public static void main(String[] args) throws FileNotFoundException { File txt = new File("C:/Users/User1/Documents/rboukarf_hard.txt"); Scanner scanner = new Scanner(txt); // 设置分隔符:匹配方括号、逗号、任意空白字符,只提取浮点数部分 scanner.useDelimiter("[\\[\\],\\s]+"); try { // 用StringBuilder代替字符串拼接,效率更高 StringBuilder resultBuilder = new StringBuilder(); while (scanner.hasNextFloat()) { float currentNum = scanner.nextFloat(); // 只读取一次当前浮点数 System.out.println(currentNum); // 按规则拼接结果 if (currentNum < 1) { resultBuilder.append("0 "); } else { resultBuilder.append("2 "); } } // 输出最终处理结果 System.out.println("\n处理后的结果:"); System.out.println(resultBuilder.toString()); } catch (Exception e) { System.out.println("Exception thrown: " + e); } finally { scanner.close(); // 记得关闭Scanner释放资源 } } }
方法二:读取整个文件内容后解析(更直观)
先读取整个文件的字符串内容,手动去除方括号、分割元素后再解析:
import java.io.File; import java.io.IOException; import java.nio.file.Files; public class FloatArrayReader { public static void main(String[] args) throws IOException { File txt = new File("C:/Users/User1/Documents/rboukarf_hard.txt"); // 读取整个文件的字符串内容 String fileContent = new String(Files.readAllBytes(txt.toPath())); // 去掉方括号,按逗号分割成单个数字字符串 String[] floatStringArray = fileContent.replaceAll("[\\[\\]]", "").split(","); StringBuilder resultBuilder = new StringBuilder(); for (String numStr : floatStringArray) { // 去除字符串前后的空白,解析为浮点数 float currentNum = Float.parseFloat(numStr.trim()); System.out.println(currentNum); // 按规则拼接结果 if (currentNum < 1) { resultBuilder.append("0 "); } else { resultBuilder.append("2 "); } } // 输出最终处理结果 System.out.println("\n处理后的结果:"); System.out.println(resultBuilder.toString()); } }
关键改进说明
- 两种方法都确保每个浮点数只被读取/解析一次,避免了原代码中重复读取导致的元素丢失和异常。
- 使用
StringBuilder代替直接字符串拼接,在处理大量元素时性能会好很多。 - 方法一中添加了
finally块关闭Scanner,符合Java资源管理的最佳实践。
内容的提问来源于stack exchange,提问作者anonbeaker
相关产品推荐
相关产品推荐

