FileCoper คลาสสาธารณะ {
สตริงสุดท้ายแบบคงที่ส่วนตัว _ORIGIN_FILE_MODE = "r";
สตริงสุดท้ายคงที่ส่วนตัว _TARGET_FILE_MODE = "rw";
ส่วนตัวคงที่นาน time1 = 0l;
สตริงส่วนตัว originFileName;
สตริงส่วนตัว targetFileName;
ส่วนตัว RandomAccessFile originFile;
ไฟล์เป้าหมาย RandomAccessFile ส่วนตัว;
เธรด int ส่วนตัว;
int ส่วนตัวคงที่ TotalThreadCount = 0;
int ส่วนตัวคงที่ดำเนินการนับ = 0;
FileCoper สาธารณะ () {
this.threadCount = 1;
TotalThreadCount = this.threadCount;
-
FileCoper สาธารณะ (String originFile, String targetFile) {
พยายาม {
this.originFileName = ต้นกำเนิดไฟล์;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = RandomAccessFile ใหม่ ((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
TotalThreadCount = this.threadCount;
} จับ (FileNotFoundException จ) {
e.printStackTrace();
-
-
FileCoper สาธารณะ (String originFile, String targetFile, int threadCount) {
พยายาม {
this.originFileName = ต้นกำเนิดไฟล์;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = RandomAccessFile ใหม่ ((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
TotalThreadCount = this.threadCount;
} จับ (FileNotFoundException จ) {
e.printStackTrace();
-
-
โมฆะสาธารณะ init (String originFile, String targetFile) พ่นข้อยกเว้น {
this.originFileName = ต้นกำเนิดไฟล์;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = RandomAccessFile ใหม่ ((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
TotalThreadCount = this.threadCount;
-
โมฆะสาธารณะ init (String originFile, String targetFile, int threadCount) ส่งข้อยกเว้น {
this.originFileName = ต้นกำเนิดไฟล์;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = RandomAccessFile ใหม่ ((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = threadCount;
TotalThreadCount = this.threadCount;
-
โมฆะสาธารณะ init (RandomAccessFile originFile, RandomAccessFile targetFile) พ่นข้อยกเว้น {
this.originFile = ต้นกำเนิดไฟล์;
this.targetFile = targetFile;
this.threadCount = 1;
TotalThreadCount = this.threadCount;
-
โมฆะสาธารณะ init (RandomAccessFile originFile, RandomAccessFile targetFile, int threadCount) พ่นข้อยกเว้น {
this.originFile = ต้นกำเนิดไฟล์;
this.targetFile = targetFile;
this.threadCount = threadCount;
TotalThreadCount = this.threadCount;
-
โมฆะการซิงโครไนซ์สาธารณะแบบคงที่เสร็จสิ้น () {
FileCoper.executedCount ++;
System.out.println("总线程【" + FileCoper.totalThreadCount + "】,已经完成【" + FileCoper.executedCount + "】ไฟล์อื่น ๆ ที่มีอยู่!!!");
ถ้า (FileCoper.totalThreadCount == FileCoper.executedCount){
นาน time2 = System.currentTimeMillis();
System.out.println("ดอกไม้:"+(time2-time1));
System.out.println("所มี【" + FileCoper.totalThreadCount + "】线程复制完成!!!");
-
-
โมฆะสาธารณะ start() พ่นข้อยกเว้น {
ถ้า (this.originFile.length() == 0)
กลับ;
ถ้า (this.threadCount == 0)
this.threadCount = 1;
// 设置目标文件大小
this.targetFile.setLength(this.originFile.length());
this.targetFile.seek (0);
this.originFile.seek (0);
time1 = System.currentTimeMillis();
System.out.println(this.originFile.length());
// 把文件分块,每一块有一对值:当前块在文件中的起始位置和结束位置
ยาว[] [] แยก = ยาวใหม่ [this.threadCount] [2];
ยาว originFileLength = this.originFile.length();
int startPos = 0;
สำหรับ (int i = 0; i < this.threadCount; i++) {
แยก[i][0] = 0;
แยก[i][1] = 0;
ถ้า (ฉัน == 0) {
แยก[i][0] = 0;
แยก [i] [1] = originFileLength / this.threadCount;
} อื่นถ้า (i == this.threadCount - 1) {
// 注意:此处不能加1,如果加1,线程多文件就会出现乱码
// แยก [i] [0] = startPos + 1;
แยก [i] [0] = startPos;
แยก [i] [1] = originFileLength;
} อื่น {
// 注意:此处不能加1,如果加1,线程多文件就会出现乱码
// แยก [i] [0] = startPos + 1;
แยก [i] [0] = startPos;
แยก [i] [1] = startPos + originFileLength / this.threadCount;
-
startPos += originFileLength / this.threadCount;
// System.out.println (แยก [i] [0] + " " + แยก [i] [1]);
Coper fc = Coper ใหม่ ("thread-" + i);
fc.init (this.originFile, this.targetFile, แยก [i] [0] แยก [i] [1]);
fc.setOriginFileName(this.originFileName);
fc.setTargetFileName(this.targetFileName);
เอฟซี.สตาร์ท();
-
-
โมฆะสาธารณะ startNew () พ่นข้อยกเว้น {
ถ้า (this.originFile.length() == 0)
กลับ;
// 设置目标文件大小
this.targetFile.setLength(this.originFile.length());
this.targetFile.seek (0);
this.originFile.seek (0);
ตำแหน่งเริ่มต้นที่ยาวนาน;
ตำแหน่งปลายยาว;
บล็อกยาว = this.originFile.length() / 1029;
ถ้า (บล็อก <= 1)
this.threadCount = 1;
สำหรับ (int i = 0; i < this.threadCount; i++) {
// 定义每次转移的长度
startPosition = i * 1,029 * (บล็อก / this.threadCount);
endPosition = (i + 1) * 1,029 * (บล็อก / this.threadCount);
ถ้า (i == (this.threadCount - 1))
endPosition = this.originFile.length ();
Coper fc = Coper ใหม่ ("thread-" + i);
fc.init(this.originFile, this.targetFile, startPosition, endPosition);
fc.setOriginFileName(this.originFileName);
fc.setTargetFileName(this.targetFileName);
เอฟซี.สตาร์ท();
-
-
Coper คลาสส่วนตัวขยายเธรด {
สตริงส่วนตัว originFileName;
สตริงส่วนตัว targetFileName;
ส่วนตัว RandomAccessFile originFile;
ไฟล์เป้าหมาย RandomAccessFile ส่วนตัว;
threadId สตริงส่วนตัว;
ตำแหน่งเริ่มต้นระยะยาวส่วนตัว;
ตำแหน่งระยะยาวส่วนตัว;
บล็อกยาวส่วนตัวความจุ;
โมฆะสาธารณะ setOriginFileName (String originFileName) {
this.originFileName = originFileName;
-
โมฆะสาธารณะ setTargetFileName (String targetFileName) {
this.targetFileName = targetFileName;
-
Coper สาธารณะ (String threadId) {
this.threadId = threadId;
-
โมฆะสาธารณะ init (RandomAccessFile originFile, RandomAccessFile targetFile, long startPosition, long endPosition) พ่นข้อยกเว้น {
this.originFile = ต้นกำเนิดไฟล์;
this.targetFile = targetFile;
this.startPosition = startPosition;
this.endPosition = ตำแหน่งสิ้นสุด;
this.blockCapacity = this.endPosition - this.startPosition;
-
โมฆะสาธารณะวิ่ง () {
// System.out.println(this.threadId + " 启动, ขยาย复制文件 【 " +
// this.originFileName + "】中的文件块" + this.startPosition + "," +
// this.endPosition + "】到目标文件【" + this.targetFileName + "】中...");
ซิงโครไนซ์ (this.originFile) {
พยายาม {
// 记录当前拷贝的字节数
int copyCount = 0;
// 数据拷贝的启示偏移量
offSet ยาว = this.startPosition;
ไบต์ [] b = ไบต์ใหม่ [16 * 1024 * 1024];
// 动态设置一次读取的字节数缓冲
ขนาดบล็อกยาว = 0;
ในขณะที่ (copyCount < this.blockCapacity) {
this.originFile.seek (ออฟเซ็ต);
ถ้า (this.blockCapacity - copyCount > 16 * 1024 * 1024)
ขนาดบล็อก = 16 * 1,024 * 1,024;
อื่น
blockSize = this.blockCapacity - copyCount;
ถ้า (blockSize > this.blockCapacity - copyCount)
blockSize = this.blockCapacity - copyCount;
int count = this.originFile.read(b, 0, (int) blockSize);
ซิงโครไนซ์ (this.targetFile) {
พยายาม {
ถ้า (copyCount == 0)
this.targetFile.seek (ออฟเซ็ต);
อื่น
this.targetFile.seek (ออฟเซ็ต + 1);
this.targetFile.write (b, 0, นับ);
} จับ (IOException จ) {
e.printStackTrace();
-
-
// 增加拷贝的字节数
copyCount += นับ;
// 拷贝其实【偏移量下移
offSet += นับ;
-
} จับ (IOException จ) {
e.printStackTrace();
-
-
// System.out.println (this.threadId + " 复制文件 【 " + this.originFileName
// + "】中的文件块【" + this.startPosition + "," + this.endPosition +
// "】到目标文件【" + this.targetFileName + "】完成!);
// 通知主线程,当前线程完成复制工作
FileCoper.เสร็จสิ้น();
-
-
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
FileCoper fc = FileCoper ใหม่ ();
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 ใหม่ (InputStreamReader ใหม่ (System.in));
// 文件来源
สตริงต้นกำเนิดไฟล์;
// 文件目标
สตริง targetFile;
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();
นาน time1 = System.currentTimeMillis();
เอฟซี.สตาร์ท();
นาน time2 = System.currentTimeMillis();
System.out.println (เวลา 2-time1);
-
-