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

            }  

        }  

    }

  }


相关文章推荐

java18.IO操作------使用带缓冲的字节流读写数据

一、使用带缓冲的字节流读写数据示例:import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja...

Java IO流 文件的复制的几种方法(字节流,字符流,缓冲流)

1:package com.io.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java...

JAVA基础再回首(二十二)——转换流概述及用法、简化写法FileWriter和 FileReader、字符缓冲流及特殊用法、字节流字符流复制文件方法总结

JAVA基础再回首(二十二)——转换流概述及用法、简化写法FileWriter和 FileReader、字符缓冲流及特殊用法、字节流字符流复制文件方法总结 版权声明:转载必须注明本文转自程序员杜鹏...
  • m366917
  • m366917
  • 2016年09月04日 23:47
  • 1183

【Java】javaIO之带缓冲流的字节流文件读写

下面用一个例子演示: package com.test.RWByteStream; import java.io.BufferedInputStream; import java.io.Buffe...
  • C_jian
  • C_jian
  • 2016年02月06日 15:23
  • 306

JAVA IO使用高速缓冲区的字节流复制文件

好记性不如赖笔头……带有高速缓冲区的字符流示例package com.Ckinghan.outputStream;import java.io.BufferedInputStream; import ...

java中的io流(输入输出流,序列化与反序列化,字节流 , 字符流,包装流,缓冲流)

四大抽象类(InputStream    OutputStream  Reader  Writer   ) 八大子类(FileInputStream,   FileOutStream,  Fil...

java-IO流3(缓冲输入字节流)

我们清楚读取文件数据使用缓冲数组读取效率更高,sun也知道使用缓冲数组读取效率更高,那么 这时候sun给我们提供了一个——缓冲输入字节流对象,让我们可以更高效率读取文件。推荐使用自己的缓冲数组输入...

java-IO流4(缓冲输出字节流)

输出字节流——–| OutputStream 所有输出字节流的基类 抽象类 ————| FileOutputStream 向文件 输出数据 的输出字节流 ————| Bufferedoutpu...

Java IO流->处理流->缓冲流->字节流&字符流

示例代码: import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Buffe...

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

接上一篇的字节流,下面主要介绍字符流,字符流和字节流的区别以及文件复制拷贝。在程序中一个字符等于两个字节,而一个汉字占俩个字节(一般有限面试会问:一个char能否存下一个汉字,答案当然是能了,一个ch...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java--IO 使用带缓冲功能的字节流复制文件
举报原因:
原因补充:

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