java RandomAccessFile类的使用案例(压缩包复制)

来源:互联网 发布:淘宝十年产品事pdf下载 编辑:程序博客网 时间:2024/05/21 22:56
使用RandomAccessFile实现
 准备:在D盘中放一个压缩文件 >=1GB的文件。(提示:可以使用setLength方式创建大文件,在和其他小文件压缩在一起)
  实现:将该文件复制到E盘。需求如下:

1. 复制的过程需要在控制台打印 进度百分比。 

2. 复制到一半将该程序停止掉。 

3. 重新启动该程序时,若上次没有拷贝完,则提示上次拷贝还没完成,是否从上次的位置开始拷贝! 1. 是:从上次结束的位置继续拷贝。 2. 否:从头开始拷贝。


代码:

package main;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建一个压缩包// try {// RandomAccessFile raf = new RandomAccessFile(new File("D:/test.zip"),// "rw");// raf.setLength(1024 * 1024 * 1024);// raf.close();// } catch (FileNotFoundException e) {// e.printStackTrace();// } catch (IOException e) {// e.printStackTrace();// }File f1 = new File("D:/test.zip");File f2 = new File("E:/test.zip");try {File f = new File(f1.getParentFile(), f2.getName() + ".log.raf");if (f.exists() && f.length() >= 8) {RandomAccessFile raf = new RandomAccessFile(f, "rw");long start = raf.readLong();System.out.println(start);if (start > 0) {Scanner sc = new Scanner(System.in);System.out.println("上次拷贝没结束,1 继续 0 重新拷贝");switch (sc.nextInt()) {case 1:copy(f1, f2, start);break;case 0:copy(f1, f2, 0);break;default:break;}}raf.close();} else {copy(f1, f2, 0);}} catch (IOException e) {e.printStackTrace();}}public static void copy(File srcDir, File destDir, long start) {long length = srcDir.length();// 拷贝文件总长度File logRaf = new File(destDir.getParentFile(), destDir.getName() + ".log.raf");try {RandomAccessFile sraf = new RandomAccessFile(srcDir, "rw");RandomAccessFile draf = new RandomAccessFile(destDir, "rw");RandomAccessFile log = new RandomAccessFile(logRaf, "rw");long sum = start;// 当前读取的总进度int read = -1;int startAvg = 0;byte[] b = new byte[1024];sraf.seek(start);while ((read = sraf.read(b)) != -1) {draf.write(b, 0, read);sum += read;int avg = (int) (100 * sum / length);if (avg > startAvg) {System.out.println("进度为: " + avg + "  %");startAvg = avg;}log.seek(0);log.writeLong(sum);// 时时刻刻保存 当前读取的进度}sraf.close();draf.close();log.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}logRaf.delete();// 复制完成后,把进度文件删除}}

截图:


原创粉丝点击