FileCoper kelas publik {
String akhir statis pribadi _ORIGIN_FILE_MODE = "r";
String akhir statis pribadi _TARGET_FILE_MODE = "rw";
privat statis lama time1 = 0l;
String pribadi originFileName;
String pribadi targetFileName;
File Asal RandomAccessFile pribadi;
File target RandomAccessFile pribadi;
threadCount int pribadi;
pribadi statis int totalThreadCount = 0;
private static int jumlah yang dieksekusi = 0;
FileCoper publik() {
this.threadCount = 1;
totalThreadCount = ini.threadCount;
}
FileCoper publik(String originFile, String targetFile) {
mencoba {
this.originFileName = originFile;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
totalThreadCount = ini.threadCount;
} tangkapan (FileNotFoundException e) {
e.printStackTrace();
}
}
FileCoper publik(String originFile, String targetFile, int threadCount) {
mencoba {
this.originFileName = originFile;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
totalThreadCount = ini.threadCount;
} tangkapan (FileNotFoundException e) {
e.printStackTrace();
}
}
public void init(String originFile, String targetFile) memunculkan Pengecualian {
this.originFileName = originFile;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
totalThreadCount = ini.threadCount;
}
public void init(String originFile, String targetFile, int threadCount) memunculkan Pengecualian {
this.originFileName = originFile;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = threadCount;
totalThreadCount = ini.threadCount;
}
public void init(RandomAccessFile originFile, RandomAccessFile targetFile) memunculkan Pengecualian {
this.originFile = originFile;
this.targetFile = targetFile;
this.threadCount = 1;
totalThreadCount = ini.threadCount;
}
public void init(RandomAccessFile originFile, RandomAccessFile targetFile, int threadCount) memunculkan Pengecualian {
this.originFile = originFile;
this.targetFile = targetFile;
this.threadCount = threadCount;
totalThreadCount = ini.threadCount;
}
public static void finish yang disinkronkan() {
FileCoper.executedCount++;
System.out.println("总线程【" + FileCoper.totalThreadCount + "】,已经完成【" + FileCoper.executedCount + "】个线程的复制!!!!");
if (FileCoper.totalThreadCount == FileCoper.executedCount){
lama waktu2 = Sistem.currentTimeMillis();
System.out.println("花费时长:"+(waktu2-waktu1));
System.out.println("所有【" + FileCoper.totalThreadCount + "】线程复制完成!!!");
}
}
public void start() melempar Pengecualian {
jika (ini.OriginFile.panjang() == 0)
kembali;
jika (ini.threadCount == 0)
this.threadCount = 1;
// 设置目标文件大小
this.targetFile.setLength(this.originFile.length());
this.targetFile.seek(0);
this.originFile.seek(0);
waktu1 = Sistem.currentTimeMillis();
System.out.println(ini.originFile.panjang());
// 把文件分块,每一块有一对值:当前块在文件中的起始位置和结束位置
long[][] split = new long[this.threadCount][2];
panjang originFileLength = this.originFile.length();
int startPos = 0;
for (int i = 0; i < this.threadCount; i++) {
membagi[i][0] = 0;
membagi[i][1] = 0;
jika (saya == 0) {
membagi[i][0] = 0;
splits[i][1] = originFileLength / this.threadCount;
} else if (i == this.threadCount - 1) {
// 注意:此处不能加1,如果加1,线程多文件就会出现乱码
// membagi[i][0] = startPos + 1;
split[i][0] = startPos;
splits[i][1] = asalPanjang File;
} kalau tidak {
// 注意:此处不能加1,如果加1,线程多文件就会出现乱码
// membagi[i][0] = startPos + 1;
split[i][0] = startPos;
splits[i][1] = startPos + originFileLength / this.threadCount;
}
startPos += originFileLength / this.threadCount;
// System.out.println(pemisahan[i][0] + " " + pemisahan[i][1]);
Coper fc = new Coper("utas-" + i);
fc.init(this.originFile, this.targetFile, splits[i][0], splits[i][1]);
fc.setOriginFileName(ini.originFileName);
fc.setTargetFileName(ini.targetFileName);
fc.mulai();
}
}
public void startNew() memunculkan Pengecualian {
jika (ini.OriginFile.panjang() == 0)
kembali;
// 设置目标文件大小
this.targetFile.setLength(this.originFile.length());
this.targetFile.seek(0);
this.originFile.seek(0);
Posisi awal yang panjang;
Posisi ujung panjang;
blok panjang = this.originFile.length() / 1029;
jika (blok <= 1)
this.threadCount = 1;
for (int i = 0; i < this.threadCount; i++) {
// 定义每次转移的长度
startPosition = i * 1029 * (blok / this.threadCount);
endPosition = (i + 1) * 1029 * (blok / this.threadCount);
if (i == (ini.threadCount - 1))
endPosition = ini.originFile.length();
Coper fc = new Coper("utas-" + i);
fc.init(ini.originFile, ini.targetFile, startPosition, endPosition);
fc.setOriginFileName(ini.originFileName);
fc.setTargetFileName(ini.targetFileName);
fc.mulai();
}
}
kelas pribadi Coper memperluas Thread {
String pribadi originFileName;
String pribadi targetFileName;
File Asal RandomAccessFile pribadi;
File target RandomAccessFile pribadi;
String threadId pribadi;
Posisi awal yang panjang pribadi;
Posisi long end pribadi;
kapasitas blok panjang pribadi;
public void setOriginFileName(String asalFileName) {
this.originFileName = originFileName;
}
public void setTargetFileName(String targetFileName) {
this.targetFileName = targetFileName;
}
Coper publik(String threadId) {
this.threadId = threadId;
}
public void init(RandomAccessFile originFile, RandomAccessFile targetFile, long startPosition, long endPosition) memunculkan Pengecualian {
this.originFile = originFile;
this.targetFile = targetFile;
this.startPosition = posisi awal;
this.endPosition = posisi akhir;
this.blockCapacity = ini.endPosition - ini.startPosition;
}
menjalankan kekosongan publik() {
// System.out.println(ini.threadId + " 启动,开始复制文件【" +
// this.originFileName + "】中的文件块【" + this.startPosition + "," +
// this.endPosition + "】到目标文件【" + this.targetFileName + "】中...");
disinkronkan (ini.OriginFile) {
mencoba {
// 记录当前拷贝的字节数
int jumlah salinan = 0;
// 数据拷贝的启示偏移量
long offSet = ini.startPosition;
byte[] b = byte baru[16 * 1024 * 1024];
// 动态设置一次读取的字节数缓冲
ukuran blok panjang = 0;
while (copyCount < ini.blockCapacity) {
this.originFile.seek(offSet);
if (ini.blockCapacity - copyCount > 16 * 1024 * 1024)
ukuran blok = 16 * 1024 * 1024;
kalau tidak
blockSize = ini.blockCapacity - copyCount;
jika (blockSize > this.blockCapacity - copyCount)
blockSize = ini.blockCapacity - copyCount;
int count = this.originFile.read(b, 0, (int) blockSize);
disinkronkan (ini.targetFile) {
mencoba {
jika (jumlah salinan == 0)
this.targetFile.seek(offSet);
kalau tidak
this.targetFile.seek(offSet + 1);
this.targetFile.write(b, 0, hitung);
} tangkapan (IOException e) {
e.printStackTrace();
}
}
// 增加拷贝的字节数
copyCount += hitungan;
// 拷贝其实【偏移量下移
offSet += hitungan;
}
} tangkapan (IOException e) {
e.printStackTrace();
}
}
// System.out.println(ini.threadId + " 复制文件【" + this.originFileName
// + "】中的文件块【" + this.startPosition + "," + this.endPosition +
// "】到目标文件【" + this.targetFileName + "】完成!");
// 通知主线程,当前线程完成复制工作
FileCoper.selesai();
}
}
public static void main(String[] args) melempar Pengecualian {
FileCoper fc = FileCoper baru();
fc.init("e:/InitialData_zhihuan.sql", "e:/InitialData_zhihuan2.sql", 30);
//fc.init("d:/ValueAdd_11.txt", "d:/ValueAdd_111.txt", 100);
// fc.init("D:/tools/music/做你的爱人.mp3", "d:/做你的爱人_5.mp3", 10);
//fc.init("E:/电影/最黑暗侵袭.rmvb", "d:/最黑暗侵袭_1.rmvb", 100);
/* // 读入键盘输入
BufferedReader br = BufferedReader baru(InputStreamReader(Sistem.in) baru);
// 文件来源
String asalFile;
// 文件目标
File target string;
System.out.println("【源文件、目标文件、线程数】");
System.out.print("要复制的源文件:");
originFile = br.readLine();
System.out.print("文件复制到目标文件:");
targetFile = br.readLine();
System.out.print("切分线程数:");
int threadCount = Integer.parseInt(br.readLine());
fc.init(originFile, targetFile, threadCount);*/
// fc.startNew();
long time1 = Sistem.currentTimeMillis();
fc.mulai();
lama waktu2 = Sistem.currentTimeMillis();
Sistem.keluar.println(waktu2-waktu1);
}
}