使用RandomAccessFile实现
准备:在D盘中放一个压缩文件 >=1GB的文件。(提示:可以使用setLength方式创建大文件,在和其他小文件压缩在一起)
实现:将该文件复制到E盘。需求如下:
准备:在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();// 复制完成后,把进度文件删除
}
}
截图: