Java使用FileInputStream读取txt文件时无法正确计算数字总和
问题根因
你的代码计算结果错误是三个核心逻辑问题导致的:
FileInputStream的read()方法返回的是读取到的字节对应的字符编码值(ASCII/UTF-8编码下数字字符'0'对应值48,'1'对应值49,以此类推),你直接把返回的编码值累加,没有转换成字符对应的真实数字值。- 读取顺序逻辑错误:第一次读取到第一个字节后,进入循环立刻调用
read()读取下一个字节才执行累加,直接跳过了文件第一个字符的计算;同时循环里没有判断读取到的是不是文件结束标记-1,会把-1也累加到结果里。 - 现有逻辑没有处理文件中的换行、空格分隔符,也不支持多位数计算,只要文件不是连续写的单个0-9数字,结果必然偏差。
修复代码(适配文件内存储单个连续数字字符的场景)
import java.io.FileInputStream; import java.io.IOException; public class HW104 { static int z; public static void inputData(String filename) { // 每次执行方法先重置累加值,避免多次调用结果叠加 z = 0; FileInputStream input = null; try { input = new FileInputStream(filename); int i; // 先读取、判断不是结束标记再处理,避免把-1算入结果 while ((i = input.read()) != -1) { char c = (char) i; System.out.println(c); // 只处理数字字符,跳过换行、空格等非数字内容 if (Character.isDigit(c)) { // 字符编码减去'0'的编码值,得到真实数字值 int num = c - '0'; z += num; } } System.out.println("数字总和:" + z); } catch (IOException e) { System.out.println(e.getMessage()); } finally { // 用finally保证流一定会关闭,避免资源泄漏 if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { inputData("arabaa.txt"); } }
扩展说明
如果你的txt文件里存储的是多位数(比如12 34 56这种用空格分隔的数字),需要额外维护一个StringBuilder缓存连续读到的数字字符,遇到非数字分隔符时把缓存的字符串转成整数再累加,不要逐字符转单个数字相加。
内容的提问来源于stack exchange,提问作者Furkan Şakir Ünal
相关产品推荐
相关产品推荐

