Java中InputStream.read()工作原理及代码读取逻辑问询
关于InputStream.read()的工作机制及你的代码疑问解答
嘿,我来帮你把这两个问题讲明白~
一、InputStream.read()的具体工作机制
- 逐字节读取:每次调用这个方法,它只会从输入流中读取一个字节的数据,而非一次性读取整个文件或大块内容。
- 返回值的含义:读取到的字节会被转换成
int类型返回,范围是0到255(因为Java的byte是有符号的,范围为-128到127,转成int时高位补0,变成无符号的0-255);如果已经读到流的末尾,没有更多数据可读,就会返回-1——这也是判断流是否读取完毕的核心标志。 - 阻塞特性:这个方法是阻塞式的,如果当前流里没有可用数据(比如文件还没读到、网络流还未传输过来),它会一直等待,直到有数据可读或者流被关闭。
二、你的代码疑问解答
你代码里的int data = inputStream.read();这一行,绝对是逐字节读取——每次循环执行到这一行,就会从c:/data.txt里读一个字节,把这个字节转成int值存在data变量里,下一次循环再读下一个字节,直到流结束。它完全不会一次性读取整个文件内容赋值给data。
另外还要提个小建议:你代码里用inputStream.available() > 0作为循环条件是不太靠谱的。available()方法返回的是当前可以无阻塞读取的字节数,不是整个文件的总字节数。比如如果文件很大,或者流的数据源是缓慢的(比如网络流),某次调用available()可能返回0,但其实流还没读完,这就会导致循环提前终止,文件复制不完整。
正确的写法应该是用read()的返回值来判断是否读到末尾,修改后的代码如下:
public static void main(String[] args) throws Exception { FileInputStream inputStream = new FileInputStream("c:/data.txt"); FileOutputStream outputStream = new FileOutputStream("c:/result.txt"); int data; // 每次读取一个字节,直到返回-1表示流结束 while ((data = inputStream.read()) != -1) { outputStream.write(data); } inputStream.close(); outputStream.close(); }
内容的提问来源于stack exchange,提问作者Fabian Andiel
相关产品推荐
相关产品推荐

