공개 클래스 FileCoper {
개인 정적 최종 문자열 _ORIGIN_FILE_MODE = "r";
개인 정적 최종 문자열 _TARGET_FILE_MODE = "rw";
개인 정적 긴 시간1 = 0l;
개인 문자열 OriginFileName;
개인 문자열 targetFileName;
개인 RandomAccessFile OriginFile;
개인 RandomAccessFile targetFile;
개인 int threadCount;
개인 정적 int totalThreadCount = 0;
개인 정적 int 실행 개수 = 0;
공개 FileCoper() {
this.threadCount = 1;
totalThreadCount = this.threadCount;
}
공개 FileCoper(String OriginFile, String targetFile) {
노력하다 {
this.originFileName = 원산지파일;
this.targetFileName = 타겟파일;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
totalThreadCount = this.threadCount;
} 잡기(FileNotFoundException e) {
e.printStackTrace();
}
}
공개 FileCoper(String OriginFile, String targetFile, int threadCount) {
노력하다 {
this.originFileName = 원산지파일;
this.targetFileName = 타겟파일;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
totalThreadCount = this.threadCount;
} 잡기(FileNotFoundException e) {
e.printStackTrace();
}
}
public void init(String OriginFile, String targetFile)에서 예외가 발생합니다.
this.originFileName = 원산지파일;
this.targetFileName = 타겟파일;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
totalThreadCount = this.threadCount;
}
public void init(String OriginFile, String targetFile, int threadCount)는 예외를 발생시킵니다.
this.originFileName = 원산지파일;
this.targetFileName = 타겟파일;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = threadCount;
totalThreadCount = this.threadCount;
}
public void init(RandomAccessFile OriginFile, RandomAccessFile targetFile)에서 예외가 발생합니다.
this.originFile = 원점파일;
this.targetFile = 타겟파일;
this.threadCount = 1;
totalThreadCount = this.threadCount;
}
public void init(RandomAccessFile OriginFile, RandomAccessFile targetFile, int threadCount)는 예외를 발생시킵니다.
this.originFile = 원점파일;
this.targetFile = 타겟파일;
this.threadCount = threadCount;
totalThreadCount = this.threadCount;
}
공개 정적 동기화 무효 완료() {
FileCoper.executedCount ++;
System.out.println("总线程[" + FileCoper.totalThreadCount + "],已经完成[" + FileCoper.executedCount + "]个线程的复程!!");
if (FileCoper.totalThreadCount == FileCoper.executedCount){
긴 시간2 = System.currentTimeMillis();
System.out.println("꽃무늬:"+(time2-time1));
System.out.println("所有【" + FileCoper.totalThreadCount + "】线程复复完成!!!");
}
}
public void start()가 예외를 발생시킵니다. {
if (this.originFile.length() == 0)
반품;
if (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());
// 把文件分块,每一块有一对值:当前块在文件中的起始位置和结束位置
long[][] 분할 = 새로운 long[this.threadCount][2];
long OriginFileLength = this.originFile.length();
int startPos = 0;
for (int i = 0; i < this.threadCount; i++) {
분할[i][0] = 0;
분할[i][1] = 0;
if (i == 0) {
분할[i][0] = 0;
분할[i][1] = OriginFileLength / this.threadCount;
} else if (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(splits[i][0] + " " + Splits[i][1]);
Coper fc = new Coper("스레드-" + i);
fc.init(this.originFile, this.targetFile, 분할[i][0], 분할[i][1]);
fc.setOriginFileName(this.originFileName);
fc.setTargetFileName(this.targetFileName);
fc.start();
}
}
public void startNew()가 예외를 발생시킵니다. {
if (this.originFile.length() == 0)
반품;
// 设置目标文件大小
this.targetFile.setLength(this.originFile.length());
this.targetFile.seek(0);
this.originFile.seek(0);
긴 startPosition;
긴 끝 위치;
긴 블록 = this.originFile.length() / 1029;
if (블록 <= 1)
this.threadCount = 1;
for (int i = 0; i < this.threadCount; i++) {
// 최종 속도를 결정합니다.
startPosition = i * 1029 * (블록 / this.threadCount);
endPosition = (i + 1) * 1029 * (블록 / this.threadCount);
if (i == (this.threadCount - 1))
endPosition = this.originFile.length();
Coper fc = new Coper("스레드-" + i);
fc.init(this.originFile, this.targetFile, startPosition, endPosition);
fc.setOriginFileName(this.originFileName);
fc.setTargetFileName(this.targetFileName);
fc.start();
}
}
개인 클래스 Coper는 Thread {를 확장합니다.
개인 문자열 OriginFileName;
개인 문자열 targetFileName;
개인 RandomAccessFile OriginFile;
개인 RandomAccessFile targetFile;
개인 문자열 스레드 ID;
개인 장기 startPosition;
프라이빗 롱 엔드Position;
프라이빗 롱 블록Capacity;
공공 무효 setOriginFileName(String OriginFileName) {
this.originFileName = OriginFileName;
}
공공 무효 setTargetFileName(문자열 targetFileName) {
this.targetFileName = 타겟파일이름;
}
공개 Coper(String threadId) {
this.threadId = 스레드Id;
}
public void init(RandomAccessFile OriginFile, RandomAccessFile targetFile, long startPosition, long endPosition)이 예외를 발생시킵니다.
this.originFile = 원점파일;
this.targetFile = 타겟파일;
this.startPosition = startPosition;
this.endPosition = 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;
// 数据拷贝的启示偏移weight
긴 offSet = this.startPosition;
바이트[] b = 새 바이트[16 * 1024 * 1024];
// 动态设置一次读取字节数缓冲
긴 블록 크기 = 0;
동안(copyCount < this.blockCapacity) {
this.originFile.seek(offSet);
if (this.blockCapacity - copyCount > 16 * 1024 * 1024)
블록 크기 = 16 * 1024 * 1024;
또 다른
blockSize = this.blockCapacity - copyCount;
if (blockSize > this.blockCapacity - copyCount)
blockSize = this.blockCapacity - copyCount;
int count = this.originFile.read(b, 0, (int) blockSize);
동기화됨(this.targetFile) {
노력하다 {
if (복사수 == 0)
this.targetFile.seek(offSet);
또 다른
this.targetFile.seek(offSet + 1);
this.targetFile.write(b, 0, count);
} 잡기(IOException e) {
e.printStackTrace();
}
}
// 增加拷贝적문자节数
카피카운트 += 카운트;
// 拷贝其实【偏移weight下移
오프셋 += 개수;
}
} 잡기(IOException e) {
e.printStackTrace();
}
}
// System.out.println(this.threadId + " 复제문件【" + this.originFileName
// + "】中的文件块【" + this.startPosition + "," + this.endPosition +
// "】到目标文件【" + this.targetFileName + "】完成!");
// 통지주线程,当前线程完成复复工業
FileCoper.finish();
}
}
public static void 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 = new BufferedReader(new InputStreamReader(System.in));
// 文件来源
문자열 원점파일;
// 文件目标
문자열 타겟파일;
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();
긴 시간1 = System.currentTimeMillis();
fc.start();
긴 시간2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
}