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
相关产品推荐
相关产品推荐

