复制文件
思路:
- 创建
FileInputStream
的对象fis
,关联源文件。 - 创建
FileOutputStream
的对象fos
,关联目标文件 - 创建字节流bytes(
byte[]
类型),使用循环,通过fis
的read
方法把源文件字节读入字节流,函数参数是字节流,返回值是读取的有效字节数。同时,通过fos
把字节流写入目标文件,当read
方法返回-1
,说明读取到了源文件的结束标志
。 - 关闭输入输出流
代码实现
private static void copyFileByBytes(File srcFile, File destFile) throws IOException {
long startTime = System.currentTimeMillis();
// 1.创建InputStream,关联源文件
FileInputStream fis = new FileInputStream(srcFile);
// 2.创建OutputStream,关联目标文件
FileOutputStream fos = new FileOutputStream(destFile);
// 3.逐字节读取视频源文件,逐字节写入目标文件,速度非常的慢
/*
int b=-1;
while((b = fis.read()) != -1){
fos.write(b);
}
*/
// 优化:使用字符数组从源文件逐字节段读入字节数组(字节流),再逐字节段写入目标文件
// 注意事项: 逐字节读取read返回值是读取的字节,遇到文件结束符读取的值为-1
// 逐字节段读取,read返回值是读取到的有效字节长度,read接受的参数是一个字符数组,把读取到的字节放入字节数组(字节流)
byte[] bytes = new byte[1024 * 10];
int len = -1;
while ((len = fis.read(bytes)) != -1){
fos.write(bytes,0,len);
}
// 4.关闭流
fos.close();
fis.close();
long endTime = System.currentTimeMillis();
System.out.println("批量读取用时:" + (endTime - startTime) + "毫秒");
}
总结
-
批量的把字节流写入文件要限定写入字节流长度,因为字节流中的数据是覆盖进行刷新的,如图
源文件读取完毕以后,字节流中内容如图所示,因为第三次读取了2个字节的有效数据,所以字节流中还保留着第二次读取的一部分剩余内容。 -
读取到文件结束标志,返回值为-1。