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

FileInputStream.read()返回整数的原因及(c = in.read()) != -1的含义

import java.io.*; 
public class CopyFile { 
    public static void main(String args[]) throws IOException { 
        FileInputStream in = null; 
        FileOutputStream out = null; 
        try { 
            in = new FileInputStream("input.txt"); 
            out = new FileOutputStream("output.txt"); 
            int c; 
            while ((c = in.read()) != -1) { 
                out.write(c); 
            } 
        }finally { 
            if (in != null) { 
                in.close(); 
            } 
            if (out != null) { 
                out.close(); 
            } 
        } 
    } 
}

嘿,这个问题问得很到位,我来一步步给你讲清楚:

1. (c = in.read()) != -1 到底是什么意思?

这个表达式是把赋值操作和条件判断合并到了一起,执行逻辑很明确:

  • 先执行 c = in.read():调用FileInputStream的read()方法读取输入文件的一个字节,把返回结果赋值给变量c
  • 再判断 c != -1:如果结果不等于-1,说明还没读到文件末尾,就进入循环体把这个字节写入输出文件;如果等于-1,就退出循环,结束整个复制流程。

说白了,这行代码就是在做:持续读取输入文件的每一个字节,直到文件读完,每读一个就写一个到输出文件里。

2. 为什么FileInputStream.read()要返回整数,而不是直接返回字节?

这是Java IO设计里一个很巧妙的细节,核心原因是为了区分「正常字节」和「文件结束标志」:

  • Java里的byte是有符号类型,范围是-128到127,如果read()直接返回byte,当读取到字节0xFF时,这个值会被解析成-1(因为有符号byte的最高位是符号位)
  • 而read()方法规定,当读到文件末尾时必须返回-1作为结束信号。如果返回byte类型,就没法区分「读到了值为-1的字节」和「读到了文件末尾」这两种完全不同的情况。

所以Java把read()的返回值设计成int类型:

  • 读取到正常字节时,会把这个字节转换成0到255之间的无符号整数(把byte的8位数据放到int的低8位,高24位补0)
  • 只有读到文件末尾时,才会返回-1(这个值不在0-255的范围内)

这样就完美解决了歧义问题,让程序能准确判断什么时候该停止读取。

内容的提问来源于stack exchange,提问作者DarkMaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:58:54