java--IO 使用带缓冲功能的字节流复制文件

原创 2015年07月09日 14:12:18

思路

 1、MyCopyFile类中copyFile方法接收由调用者传递的两个参数(要复制的文件完整路径file和要复制到哪里的目录path)

 2、创建file和path的实例对象,并进行一系列检测,避免复制后覆盖同名文件。并创建目标文件的完整路径。

 3、检测完毕后就创建输入流和输出流。为了提高效率,加入缓冲技术。

 4、(附加)显示一些格式化信息、记录程序执行时间等。

 5、因为是字节流,所以不能使用读一行的方法,只能一次读一个字节,效率低,如果文件不是很大,

            可以建立一个数组,把输入流中的数据全部读到数组中,在把数组中的数据一次性写入输出流,

           但如果数据太大,会出现内存溢出,所以进行文件大小的判断,

        小于等于10MB用新增数组的方法,大于10MB用一次读一个方法,这样可以尽量提高效率。

 6、复制完成,关闭资源public class Test7 { 

    public static void main(String[] args) {

    //指定源文件 

            String copy = "E:\\JAVA\\JSP上机\\heima\\gj.txt";  

            //指定目标路径,没有责创建  

            String savePath = "F:\\abc";  

             MyCopyFile.copyFile(copy,savePath); 

    }

}

class MyCopyFile{  

    /** 

     * 复制文件 

     * @param file 需要复制文件的完整路径 

     * @param path 要复制到的目标目录 

     */  

    public static void copyFile(String file,String path){  

        BufferedInputStream bis = null;  

        BufferedOutputStream bos = null;  

  try{  

            File copyFile = new File(file);   

            File savePath = new File(path);  

              

            //如果要复制的文件不存在或者不是文件,发出提示并退出程序  

            if (!(copyFile.exists() && copyFile.isFile())){  

                System.out.println("无效的文件,请检查");  

                System.exit(0);  

            }  

            //如果要保存到的目录不存在,则创建该目录   

            if (!(savePath.isDirectory())){  

                System.out.println("你指定的目录不存在,将自动创建!");  

                savePath.mkdirs();  

            }  

              

            //创建目标文件完整路径。  

            File saveFile = new File(savePath+"\\"+copyFile.getName());  

            //如果saveFile是一个文件,说明有同名文件存在,则提示并退出程序,避免覆盖同名文件。  

            if (saveFile.isFile()){  

                System.out.println("注意!该目录下有同名文件。");  

                System.exit(0);  

            }   

  

            //创建输入流和输出流。  

            bis = new BufferedInputStream(new FileInputStream(copyFile));  

            bos = new BufferedOutputStream(new FileOutputStream(saveFile));  

  

  //获取输入流中的的字节数。  

            long len = bis.available();  

              

            //格式化显示文件大小,保留1位小数  

            DecimalFormat df = new DecimalFormat(".0");  

            String size = null;  

            if(len > 1024*1024*10){  

                System.out.println("要复制的文件超过10MB,不能复制!");  

            }else if(len > 1024*1024){  

                size = df.format(len/1024/1024) + " MB";  

            }else if(len > 1024){  

                size = df.format(len/1024) + " KB";  

            }else{  

                size = len + " 字节";  

            }  

            System.out.println("文件大小:" + size);  

            System.out.println("复制中...");  

              

            //记录复制开始时毫秒值  

            long start = System.currentTimeMillis();  

              

            //如果文件大于10MB,用一次读一个字节方式  

            //否则就用数组一次性读取方式复制  

            if(len > 1024*1024*10){  

                int by;  

                while((by=bis.read())!=-1){  

                    bos.write(by);  

  }  

            }else{  

                //创建数组缓冲区,指定大小为输入流中的的字节数len。  

                byte[] bytes = new byte[(int)len];        

                bis.read(bytes);    //从输入流中读取所有数据存储到数组中。  

                bos.write(bytes);   //将数组中的所有数据写入的输出流缓冲区中。  

            }  

            //记录复制结束精辟时毫秒值  

            long end = System.currentTimeMillis();  

              

            System.out.println("复制完成");  

            System.out.println("耗时:"+(end-start)+"毫秒");  

        }  

        catch(IOException e){  

            throw new RuntimeException("复制文件失败");  

        }  

        //关闭流资源  

        finally{  

            try{  

                if (bis!=null){  

                    bis.close();  

                }  

            }  

            catch(IOException e){  

                throw new RuntimeException("输出流关闭失败");  

            }  

            try{  

  if (bos!=null){  

                    bos.close();  

                }  

            }  

            catch(IOException e){  

                throw new RuntimeException("输出流关闭失败");  

            }  

        }  

    }

  }


JAVA-IO流中缓存区的使用(BufferedReader和BufferedWriter)以及复制内容

前言:在java中为了提高FileWriter的写入效率,出现了BufferedWriter缓存技术      缓存区的出现是为了提高流的操作效率而出现的,所以在创建缓存区之前,必须要先有流对象 ...
  • diaobao_weixiao
  • diaobao_weixiao
  • 2016年10月14日 17:12
  • 866

java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝

接上一篇的字节流,下面主要介绍字符流,字符流和字节流的区别以及文件复制拷贝。在程序中一个字符等于两个字节,而一个汉字占俩个字节(一般有限面试会问:一个char能否存下一个汉字,答案当然是能了,一个ch...
  • fengshizty
  • fengshizty
  • 2014年11月19日 17:59
  • 2329

JAVA使用字节流与高速缓冲字节流复制文件对比

好记性不如赖笔头……/** * @author Ckinghan * @描述:使用字节流复制文件与使用高速缓冲流复制文件的对比示例 * WebLogin.log 文件大小:15,028...
  • ckinghan58
  • ckinghan58
  • 2017年05月15日 16:23
  • 294

使用带有缓冲的字节流读写数据

-------------siwuxie095                   工程名:TestRWBufferedByteStream 包名:com.siwuxie095.bufferedbyt...
  • siwuxie095
  • siwuxie095
  • 2017年03月26日 18:10
  • 138

JAVA IO :使用带缓冲的字节流读写数据

JAVA IO :使用带缓冲的字节流读写数据 /**  * 使用带缓冲的字节流读取数据  * 比没有使用缓冲的方法COP所用的时间要长很多  * BufferedInputStream()...
  • Jian_Sir
  • Jian_Sir
  • 2015年03月29日 21:54
  • 1386

字节流、字符流和缓冲流

字节流和字符流,且他们都有输入流(从屏幕、硬盘或是其他数据源读取数据放入内存中)和输出流(用来向屏幕、硬盘等目的地输出内容),字节流就是一个字节一个字节的读取或是输出(字节都是8位,0到255之间的整...
  • muyisengren
  • muyisengren
  • 2014年10月15日 15:44
  • 2194

使用字节流复制文件的四种方式以及效率比较

在java.io包中操作文件内容的主要有两大类:字节流、字符流。在对音乐和视频等文件进行IO操作时,都是使用字节流。 使用字节流操作时文件,有四种方式,现对一个flac文件分别使用四种方式进行复制,...
  • liuweiballack
  • liuweiballack
  • 2015年10月05日 21:07
  • 4872

字节流 缓冲流 数据流

1、字节流 先了解流的概念 流分为输入流和输出流,一个对象的输入流是指从外界到这个对象的流,输出流则是从这个对象到它的外界的流。 例如:对于一个JAVA程序来说,它是运行在JVM(JAVA虚拟机...
  • caohui1994
  • caohui1994
  • 2015年08月03日 20:01
  • 780

Java字节流实现文件夹的拷贝

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java...
  • baidu_35738377
  • baidu_35738377
  • 2016年12月15日 09:08
  • 624

Java中的字节流、缓冲流

一、Java中流的分类 1.字符流 Reader   Writer 字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数...
  • sinat_34669892
  • sinat_34669892
  • 2016年10月05日 14:44
  • 1551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java--IO 使用带缓冲功能的字节流复制文件
举报原因:
原因补充:

(最多只允许输入30个字)