天天看点

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

使用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();// 复制完成后,把进度文件删除
	}

}

           

截图:

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