过程
1、先输入:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去
2、输出:以内存为基准,把内存中的数据以字节的形式写到文件中
package com.itheima.demo6copy;
import java.io.*;
public class CopyDemo1 {
public static void main(String[] args) throws Exception {
//目标:使用字节流完成文件的复制操作
//源文件:E:\Pictures\dog.jpeg
//目标文件: D:\jt_new.jpg
try {
copyFile("E:\\Pictures\\dog.jpeg", "D:\\jt_new.jpg");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void copyFile(String srcPath, String destPath) throws IOException {
//1、创建一个文件字节输入流管道和源文件接通,文件字节输出流管道和目标文件接通
InputStream fis = new FileInputStream(srcPath);
OutputStream fos = new FileOutputStream(destPath);
//2、读取一个字节数组,写入一个字节数组
byte[] buffer = new byte[1024];
int len;
while((len = fis.read(buffer)) != -1){
//fis.read(buffer)尝试从源文件中读取最多为buffer数组的长度的字节数量,存到buffer数组中。并返回读取的字节数量
fos.write(buffer,0,len);//fos.write(buffer,0,len)把buffer数组中前len个字节写入目标文件
/**
* 每次调用write()方法时,它都会从文件指针当前所在的位置开始写入指定数量的字节(len)。
* 但是呢,每次调用write()后,文件指针会向前移动len个位置。
* 所以下次再调用write()时,它会从文件指针的新位置继续写入
* 这样,新写入的数据就会紧跟在上次写入的数据之后,而不会覆盖它。
*/
}
System.out.println("复制完成");
}
}
注意点
1、(len = fis.read(buffer)) != -1)
fis.read(buffer)尝试从源文件中读取最多为buffer数组的长度的字节数量,存到buffer数组中。并返回读取的字节数量
2、fos.write(buffer,0,len);
fos.write(buffer,0,len)把buffer数组中前len个字节写入目标文件
3、为什么不会第二次数组的字节不会覆盖第一次
每次调用write()方法时,它都会从文件指针当前所在的位置开始写入指定数量的字节(len)。
但是呢,每次调用write()后,文件指针会向前移动len个位置。
所以下次再调用write()时,它会从文件指针的新位置继续写入
这样,新写入的数据就会紧跟在上次写入的数据之后,而不会覆盖它。
字节流的优势
字节流非常适合做文件的复制操作
任何文件的底层都是字节,字节流做复制,是一字不漏的转移完全部字
节,只要复制后的文件格式一致就没问题!