InputStream.read()
和 OutputStream.write()
方法组合使用可以完成文件的复制功能。
先贴出代码
InputStream inputStream = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] b = new byte[2048];
int size;
while ((size = inputStream.read(b)) > 0) {
System.out.println(size); //size为2048
os.write(b, 0, size);
}
// 这里主要关闭。
os.close();
inputStream.close();
参数
b 读取数据的缓冲区。
运行过程
①先读取文件
inputStream.read(b))
从输入流读取 b (2048)个字节,并将它们存储到缓冲区b 。
根据byte[] b = new byte[2048];
b的初始化值如下图所示[0,0,0,0,…,0,0,0]
经过inputStream.read(b)
方法后,b会被赋值,如下图所示
②再输出文件
紧接着OutputStream.write()
方法可以将字节数组b写入到文件中,
public void write(byte[] b,int off, int len)
元素b[off]
是写入的第一个字节, b[off+len-1]
是此操作写入的最后一个字节。
这里大家可能会有个疑问,就是用while循环读取的话,为第二次循环的时候就自动read后面的字节了呢?
(参考文章:https://blog.csdn.net/liangruimi/article/details/44856843)
根据我们的代码设置,一个while循环可以读取2048个字节,那么假如文件大小为5000字节,
那么需要循环三次while语句,即可完成文件的读取和写入(也就是复制文件)。
报错
如果b是null ,则抛出NullPointerException 。
如果off为负数,或len为负数,或off+len大于数组b的长度,则抛出IndexOutOfBoundsException 。