--> 這裡用到兩種方法...其實也不算兩種,就一點點不一樣而已...
---> Test 測試類
package com.dragon.java.multithreadcopy;
import java.io.File;
import java.util.Scanner;
/*
* 利用多線程復制文件1
*/
public class Test {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入文件路徑:");
File srcFile = new File(scanner.next());
System.out.println("請輸入線程數:");
int n = scanner.nextInt();
if (!srcFile.exists()) {
System.out.println("該文件不存在!");
}
File desFile = new File(srcFile.getParent(), "new" + srcFile.getName());
// 從線程數得到每個線程要復制的數據大小
long partLenghth = srcFile.length() / n + 1;
for (int i = 1; i < n + 1; i++) {
// 每次復制的開始和結束位置
new MyThread(srcFile, desFile, partLenghth * (i - 1), partLenghth
* i).start();
}
}
}
--> MyThread類即線程實現類
package com.dragon.java.multithreadcopy;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class MyThread extends Thread {
private File srcFile;
private File desFile;
private long start;
private long end;
MyThread() {
super();
}
// 構造方法傳入源文件、目標文件、本次開始位置以及結束位置
MyThread(File srcFile, File desFile, long start, long end) {
super();
this.srcFile = srcFile;
this.desFile = desFile;
this.start = start;
this.end = end;
}
@Override
public void run() {
RandomAccessFile rafSrc = null;
RandomAccessFile rafDes = null;
try {
rafSrc = new RandomAccessFile(srcFile, "r");
rafDes = new RandomAccessFile(desFile, "rw");
// 將文件指針移動到將要開始復制的位置
rafSrc.seek(start);
rafDes.seek(start);
int len = -1;
byte[] buffer = new byte[64];
while ((len = rafSrc.read(buffer)) != -1) {
rafDes.write(buffer, 0, len);
// 當讀取到的位置大於或等於要結束的位置時跳出循環
if (rafSrc.getFilePointer() >= end) {
break;
}
}
} catch (IOException e) {
System.out.println(e);
}
}
}
--> -----------------------------------------------------------------------邪惡的分割線----------------------------------------------------------------------------
--> Test測試
import java.util.Scanner;
/*
* 利用多線程復制文件利用多線程復制文件2
*/
public class Test {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入文件路徑:");
File srcFile = new File(scanner.next());
System.out.println("請輸入線程個數:");
int n = scanner.nextInt();
if (!srcFile.exists()) {
System.out.println("該文件不存在!");
}
File desFile = new File(srcFile.getParent(), "new" + srcFile.getName());
long partLenghth = srcFile.length() / n + 1;
for (int i = 1; i < n + 1; i++) {
// 每次傳入單線程復制的長度
new MyThread(srcFile, desFile, partLenghth, MyThread.getPointer())
.start();
}
}
}
--> MyThread線程實現類
1 package com.dragon.java.newthreadcopy;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.RandomAccessFile;
6
7 public class MyThread extends Thread {
8 private File srcFile;
9 private File desFile;
10 private long partLength;
11 private static long pointer = 0;
12
13 MyThread() {
14 super();
15 }
16
17 MyThread(File srcFile, File desFile, long partLength, long pointer) {
18 super();
19 this.srcFile = srcFile;
20 this.desFile = desFile;
21 this.partLength = partLength;
22 MyThread.pointer = pointer;
23 }
24
25 @Override
26 public void run() {
27 RandomAccessFile rafSrc = null;
28 RandomAccessFile rafDes = null;
29 try {
30 rafSrc = new RandomAccessFile(srcFile, "r");
31 rafDes = new RandomAccessFile(desFile, "rw");
32
33 rafSrc.seek(pointer);
34 rafDes.seek(pointer);
35
// 一次性復制完整的一部分長度
36 byte[] buffer = new byte[(int) partLength];
37 int len = rafSrc.read(buffer);
38 rafDes.write(buffer, 0, len);
39 pointer = rafSrc.getFilePointer();
40 } catch (IOException e) {
41 System.out.println(e);
42 }
43 }
44
45 public static long getPointer() {
46 return pointer;
47 }
48 }
--> 感覺第二種也完全是多余的啊,就是一種方法...