9.0、Java_IO流 - 缓冲字节流、文件拷贝工具类
Java 缓冲流本身不具有 IO 流的读写功能,只是在别的流(节点流或者处理流)中加上缓冲功能提高效率,就像是把别的流包装起来一样,因此缓冲流是一种处理流(包装流);
当对文件或者其他数据源进行频繁的读写操作时,效率比较低,这时如果使用缓冲流就能够更高效的读写信息;因为缓冲流是先将数据缓存起来,然后当缓存区存满后或者手动刷新时再一次性的读取到程序或写入目的地中;
因此缓冲流还是很重要的,我们在 IO 操作时记得加上缓冲流来提升性能;BufferedInputStream 和 BufferedOutputStream 这两个流式缓冲字节流,通过内部缓存数组来提高操作流的效率;
实现代码时,其实就是在 FileInputStream(节点流)外面在套一层 BufferInputStream(包装流);那么我想说的是 -> 在关闭流对象的时候,我们应该先关闭包装流,在关闭节点流;
很好理解:在创建的时候,相当于先创建了一个节点流 [ 顺便讲一下:节点流是直接连接文件的流 ] ,然后在节点流的外面包上一层包装流;所以我们关闭流的时候肯定要先把包在外面的流先关闭 [ 我把这个操作过程想象成打开这层包装然后关闭这层包装流 ( 这样想更方便记住 ) ] ,打开然后才能拿到被包在里面的节点流吧,最后才能关闭节点流;
缓冲字节流中 byte[ ] 数组的大小默认为 8192,也就是 2 的 13次方
public class Test {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
fis = new FileInputStream("D:/pic.jpg");
fos = new FileOutputStream("D:/pic2.jpg");
bis = new BufferedInputStream(fis);
bos = new BufferedInputStream(fos);
int tmp = 0;
while((tmp = bis.read()) != -1) {
bos.write(tmp);
}
}catch(Exception e) {
e.printStackTrance();
}finally {
try {
if(bis != null) {
bis.close();
}
if(bos != null) {
bos.close();
}
if(fis != null) {
fis.close();
}
if(fos != null) {
fos.close();
}
}catchException e() {
e.printStackTrance();
}
}
}
}
最后我们利用缓冲字节流写一个实例;
缓冲字节流实现 -> 文件拷贝工具类 ↓↓↓
public class CopyFileUtil {
/**
* 利用缓冲字节流实现 -> 文件拷贝
* @param src 源文件 绝对路径
* @param des 目标文件 绝对路径
*/
public static void copyFile(String src,String des) {
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try{
fis = new FileInputStream(src);
bis = new BufferedInputStream(fis);
fos = new FileOutputStream(des);
bos = new BufferedOutputStream(fos);
int tmp = 0;
while((tmp = bis.read()) != -1) {
bos.write(tmp);
}
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(bis != null) {
bis.close();
}
if(bos != null) {
bos.close();
}
if(fis != null) {
fis.close();
}
if(fos != null) {
fos.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}