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

思路

 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("输出流关闭失败");  

            }  

        }  

    }

  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值