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