前面两篇,我们分别学习了read和write方法。知道如何读文件和如何写文件,那么,我们就知道如何拷贝文件。今天,我们就来写一个拷贝图片的代码,然后再写一个拷贝视频的代码,最后来分析下这种拷贝文件的缺点。
文件拷贝的核心6行代码
这里说的是6行代码,待会会在代码中标注出来,真的,掌握了这6行核心代码,IO流的操作就算基本学会了,学好了。下面来一个图片拷贝例子,我桌面有一个test.png图片,现在我需要把这个图片拷贝到当前eclipse的java项目的根目录下,拷贝后图片名称为copy.png。
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo3_CopyFile {
public static void main(String[] args) throws IOException {
//1.创建输入流对象
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test.png");
//2.创建输出流对象
FileOutputStream fos = new FileOutputStream("copy.png");
int b;
//3.循环判断,不为-1就写入文件
while ((b = fis.read()) != -1) {
//4. 写入文件
fos.write(b);
}
//5.关闭输入流
fis.close();
//6.关闭输出流
fos.close();
}
}
运行之后,手动刷新Java项目根目录下,可以看到copy.png,而且右键这个图片,大小和桌面的图片也一样。下面来看看拷贝一个视频文件。我在桌面准备一个30多兆的mp4文件,同样方法拷贝到项目根目录。
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo3_CopyFile {
public static void main(String[] args) throws IOException {
//1.创建输入流对象
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test.mp4");
//2.创建输出流对象
FileOutputStream fos = new FileOutputStream("copy.mp4");
int b;
//3.循环判断,不为-1就写入文件
while ((b = fis.read()) != -1) {
//4. 写入文件
fos.write(b);
}
//5.关闭输入流
fis.close();
//6.关闭输出流
fos.close();
}
}
首先,我们只需要改文件路径和名称就行,代码都不动,这就是6行核心代码。开始运行之后,发现等了足足三分钟以后,我的控制台才结束拷贝。其实,原理我们都知道,读和写的方法都是采用一个字节一个字节读取。30M差不多有30*1024*1024这么多个字节,也就是说完成这个拷贝需要2倍的30*1024*1024次数,所以时间很长。这种拷贝速度,我们是不能接受的。所以,下一篇,我们讨论如何换一种方式提高拷贝速度。