【Java学习笔记】基础知识学习19【一个大文件的复制方法】
2013-07-28 14:32
1246 查看
大文件的复制,其实就是分段缓存复制的过程。一部分内容缓冲,一部分内容写入。而不是边度边写。边读边写会导致磁盘的磁头反复变换,影响速度。
参考代码如下:
在这里面,使用了一个随机文件读写的类:RandomAccessFile
这个类的很多方法与FileInputStream等很相似,有一些有特点的方法,比如seek等。seek用于定位文件指针。
参考代码如下:
static void copyFile(String sFile, String dFile, int Max_Size) { int BufferSize = 1024*1024*20; if (Max_Size != 0) { BufferSize = Max_Size; } File sFile2 = new File(sFile); File dFile2 = new File(dFile); if (!sFile2.exists()) return; if (!dFile2.exists()) { try { dFile2.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } } try { RandomAccessFile sIn = new RandomAccessFile(sFile2, "r"); try { RandomAccessFile sOut = new RandomAccessFile(dFile2, "rw"); // 多次读,写 // 根据文件大小来决定 if (BufferSize > sFile2.length()) { byte[] sByte = new byte[(int) sFile2.length()]; try { sIn.read(sByte); } catch (IOException e1) { // TODO Auto-generated catch block System.out.print("读源文件错误!\n"); return; } try { sOut.write(sByte); sOut.close(); sIn.close(); } catch (IOException e) { // TODO Auto-generated catch block System.out.print("文件写入错误!\n"); return; } } else { // System.out.print("Source Size:"+sFile2.length()+"\n"); // System.out.print("(int) (sFile2.length() / BufferSize)"+(int) // (sFile2.length() / BufferSize)+"\n"); for (int i = 0; i <= (int) (sFile2.length() / BufferSize); i++) { // System.out.print("第"+i+"段数据\n"); if (i == (int) (sFile2.length() / BufferSize)) { byte[] sByte = new byte[(int) (sFile2.length() - i * BufferSize + 1)]; try { sIn.seek((int) i * BufferSize); sIn.read(sByte); } catch (IOException e) { // TODO Auto-generated catch block System.out.print("读源文件错误!\n"); return; } try { sOut.seek((int) i * BufferSize); sOut.write(sByte); sIn.close(); sOut.close(); } catch (IOException e) { // TODO Auto-generated catch block System.out.print("写入目标文件错误!\n"); return; } } else { byte[] sByte = new byte[BufferSize]; try { sIn.seek((int) i * BufferSize); sIn.read(sByte); } catch (IOException e) { // TODO Auto-generated catch block System.out.print("读源文件错误!\n"); return; } try { sOut.seek((int) i * BufferSize); sOut.write(sByte); } catch (IOException e) { // TODO Auto-generated catch block System.out.print("写入目标文件错误!\n"); return; } } } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } }
在这里面,使用了一个随机文件读写的类:RandomAccessFile
这个类的很多方法与FileInputStream等很相似,有一些有特点的方法,比如seek等。seek用于定位文件指针。
相关文章推荐
- 【Java学习笔记】基础知识学习18【一个小文件的复制方法】
- 【java基础知识(学习笔记)】--方法的重载注意事项
- 【Java学习笔记】基础知识学习6【类的基础、方法,对象基础、包】
- Java基础知识强化之IO流笔记49:IO流练习之 复制指定目录下指定后缀名的文件并修改名称的案例
- Java基础知识强化之IO流笔记10:File类输出指定目录下指定后缀名的文件名称案例(File类的文件过滤器方法改进list( FilenameFilter ff))
- 【Java学习笔记】基础知识学习17【文件文本读取写入】
- java基础-用IO演示文件的复制过程(学习笔记)
- 【Java学习笔记】基础知识学习5【数组排序,复制】
- Java基础知识强化之IO流笔记19:FileOutputStream的三个write方法
- 【java基础知识(学习笔记)】--方法中的参数传递
- 【Java学习笔记】基础知识学习14【文件】
- Java基础知识强化之IO流笔记52:IO流练习之 把一个文件中的字符串排序后再写入另一个文件案例
- 【java基础知识(学习笔记)】--方法的重载
- 【Java学习笔记】基础知识学习3【基本循环方法技巧】
- Java基础知识强化之IO流笔记39:字符流缓冲流之复制文本文件案例01
- Java 基础知识学习笔记——继承相关内容
- Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例
- JAVA基础再回首(二十二)——转换流概述及用法、简化写法FileWriter和 FileReader、字符缓冲流及特殊用法、字节流字符流复制文件方法总结
- java 从零开始,学习笔记之基础入门<servlet_文件下载>(二十七)
- 【Java学习笔记】基础知识学习1【基本输出,数据类型,基础运算符号】