import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
public class FileCopyThread implements Runnable {
private long head;
private long end;
private String fileSourse;
private String fileTarget;
public String getFileSourse() {
return fileSourse;
}
public void setFileSourse(String fileSourse) {
this.fileSourse = fileSourse;
}
public String getFileTarget() {
return fileTarget;
}
public void setFileTarget(String fileTarget) {
this.fileTarget = fileTarget;
}
public FileCopyThread(long head, long end) {
super();
// TODO Auto-generated constructor stub
this.head = head;
this.end = end;
}
public void run() {
try {
RandomAccessFile rin = new RandomAccessFile(fileSourse, "r");
RandomAccessFile rout = new RandomAccessFile(fileTarget, "rw");
rin.seek(head);
rout.seek(head);
byte[] buffer = new byte[1024];
int length = 0;
while (end - rin.getFilePointer() >= 1024) {
rin.read(buffer);
rout.write(buffer);
}
length = (int) (end - rin.getFilePointer());
rin.readFully(buffer, 0, length);
rout.write(buffer, 0, length);
rout.close();
rin.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// 读入键盘输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 文件来源
String fileCopyFrom;
// 文件目标
String fileCopyTo;
try {
System.out.println("要复制的文件:");
fileCopyFrom = br.readLine();
System.out.println("文件复制到:");
fileCopyTo = br.readLine();
// 创建一个来源 File 实例
File fileIn = new File(fileCopyFrom);
// 创建 RandomAccessFile 目标实例
RandomAccessFile fileOut = new RandomAccessFile(fileCopyTo, "rw");
// 定义文件长度
long length = fileIn.length();
fileOut.setLength(length);
System.out.println("切分线程数:");
int num = Integer.parseInt(br.readLine());
// 创建对象 实例
FileCopyThread[] copy = new FileCopyThread[num];
// 创建线程 实例
Thread[] thread = new Thread[num];
// h 头;e 尾;block 块数(k)
long h = 0;
long e = 0;
long block = length / 1024;
if(block<=1)
num=1;
for (int i = 0; i < num; i++) {
// 定义 每次转移的长度
h = i * 1024*(block / num);
e = (i + 1) * 1024*(block/ num);
if (i == (num - 1))
e = length;
// 创建新 FileCopyThread实例 (h, e)
copy[i] = new FileCopyThread(h, e);
thread[i] = new Thread(copy[i]);
// 设置新实例的文件来源
copy[i].setFileSourse(fileCopyFrom);
// 设置新实例的文件目标
copy[i].setFileTarget(fileCopyTo);
// 线程启动
thread[i].start();
}
fileOut.close();
System.out.println("转移完成。");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
分享到:
相关推荐
Java NIO(New Input/Output)是Java标准库在J2SE 1.4及更高版本中引入的一个重要更新,它的出现是为了改进传统的IO模型,提高I/O操作的效率和并发性。NIO的主要特点包括非阻塞I/O、字符转换、缓冲以及通道等。 1. ...
7.4.3 拷贝构造方法 7.4.4 重载构造方法 7.4.5 调用构造方法 7.4.6 初始化块 7.5 包 7.5.1 包的概念 7.5.2 类的导入 7.5.3 包名与目录 7.5.4 静态导入 7.5.5 Java包介绍 7.6 类设计技巧 7.7 实例:完善...
JProfiler是一款强大的Java剖析工具,它集成了CPU、线程和内存的分析,适用于J2SE和J2EE应用程序。通过其直观的GUI界面,开发者能够定位性能瓶颈,检测内存泄漏,解决线程问题,以及进行heap分析。JProfiler还提供了...
- **对象创建与内存分配**:浅拷贝与深拷贝,对象的引用与可达性分析。 - **垃圾收集机制**:GC的基本原理,分代收集,Stop-the-world事件,新生代和老年代的垃圾回收算法。 - **内存泄漏与内存溢出**:识别和...
JProfiler是一款强大的Java性能分析工具,它可以帮助开发者深入洞察J2SE和J2EE应用程序的CPU使用、线程活动以及内存管理情况。本文将详细介绍如何在Windows环境下安装和使用JProfiler,包括本地监控和远程监控Tomcat...
- **特点**:可变字符串,适用于大量字符串操作的情况,非线程安全,性能优于 `StringBuffer`。 - **API 方法**: - `toString()` - `reverse()` - `append(Object obj)` - `insert(int offset, Object obj)` -...
� Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的有限子集,尚不承诺遵守 Java 任何 Java 规范 , 可能会造 成J ava 阵营的进一步分裂。 � 现有应用完善度不太够,需要的开发工作量较大。--------------------...