You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:15:43