パブリック クラス FileCoper {
プライベート静的最終文字列_ORIGIN_FILE_MODE = "r";
プライベート静的最終文字列_TARGET_FILE_MODE = "rw";
プライベート静的ロングタイム1 = 0l;
プライベート文字列の元のファイル名;
プライベート文字列ターゲットファイル名;
プライベートランダムアクセスファイルoriginFile;
プライベートランダムアクセスファイルターゲットファイル;
プライベート int threadCount;
プライベート静的 int totalThreadCount = 0;
プライベート静的 int 実行数 = 0;
public FileCoper() {
this.threadCount = 1;
totalThreadCount = this.threadCount;
}
public FileCoper(String OriginFile, String targetFile) {
試す {
this.originFileName = 原点ファイル;
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 = this.threadCount;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public FileCoper(String OriginFile, String targetFile, int threadCount) {
試す {
this.originFileName = 原点ファイル;
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 = this.threadCount;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void init(String OriginFile, String targetFile) throws Exception {
this.originFileName = 原点ファイル;
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 = this.threadCount;
}
public void init(String OriginFile, String targetFile, int threadCount) throws Exception {
this.originFileName = 原点ファイル;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = スレッド数;
totalThreadCount = this.threadCount;
}
public void init(RandomAccessFileoriginFile, RandomAccessFiletargetFile) throws Exception {
this.originFile = 原点ファイル;
this.targetFile = ターゲットファイル;
this.threadCount = 1;
totalThreadCount = this.threadCount;
}
public void init(RandomAccessFile OriginFile, RandomAccessFile targetFile, int threadCount) throws Exception {
this.originFile = 原点ファイル;
this.targetFile = ターゲットファイル;
this.threadCount = スレッド数;
totalThreadCount = this.threadCount;
}
public static synchronized voidfinish() {
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];
長い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] = 原点ファイルの長さ / this.threadCount;
else if (i == this.threadCount - 1) {
// 注意:此处不可加1,如果加1,線上程多文件就会出现乱码
// 分割[i][0] = startPos + 1;
分割[i][0] = 開始位置;
分割[i][1] = 原点ファイルの長さ;
} それ以外 {
// 注意:此处不可加1,如果加1,線上程多文件就会出现乱码
// 分割[i][0] = startPos + 1;
分割[i][0] = 開始位置;
分割[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, Splits[i][0], Splits[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 extends Thread {
プライベート文字列の元のファイル名;
プライベート文字列ターゲットファイル名;
プライベートランダムアクセスファイルoriginFile;
プライベートランダムアクセスファイルターゲットファイル;
プライベート文字列スレッドID;
プライベートの長い startPosition;
プライベートロングエンドポジション;
プライベートロングブロック容量;
public void setOriginFileName(String OriginFileName) {
this.originFileName = 原点ファイル名;
}
public void setTargetFileName(String targetFileName) {
this.targetFileName = targetFileName;
}
public Coper(String threadId) {
this.threadId = スレッド ID;
}
public void init(RandomAccessFileoriginFile,RandomAccessFiletargetFile,longstartPosition,longendPosition) throws Exception {
this.originFile = 原点ファイル;
this.targetFile = ターゲットファイル;
this.startPosition = 開始位置;
this.endPosition = 終了位置;
this.blockCapacity = this.endPosition - this.startPosition;
}
public void run() {
// System.out.println(this.threadId + " 启アニメーション,开始复制文件【" +
// this.originFileName + "]中の文件块【" + this.startPosition + "," +
// this.endPosition + "]到目标文件【" + this.targetFileName + "]中...");
同期済み (this.originFile) {
試す {
// 记录当前贝的字节数
int コピーカウント = 0;
// データストレージの表示オフセット量
ロングオフセット = this.startPosition;
byte[] b = 新しいバイト[16 * 1024 * 1024];
// 動态設置一次读取的字节数缓冲
長いブロックサイズ = 0;
while (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();
}
}
// 追加の文字数
コピーカウント += カウント;
// 贝其实【偏移量下移
オフセット += カウント;
}
} キャッチ (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) throws Exception {
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("要复制のソース文件:");
原点ファイル = 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);
}
}