--> 这里用到两种方法...其实也不算两种,就一点点不一样而已...

---> 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线程实现类

 package com.dragon.java.newthreadcopy;

 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 partLength;
private static long pointer = 0; MyThread() {
super();
} MyThread(File srcFile, File desFile, long partLength, long pointer) {
super();
this.srcFile = srcFile;
this.desFile = desFile;
this.partLength = partLength;
MyThread.pointer = pointer;
} @Override
public void run() {
RandomAccessFile rafSrc = null;
RandomAccessFile rafDes = null;
try {
rafSrc = new RandomAccessFile(srcFile, "r");
rafDes = new RandomAccessFile(desFile, "rw"); rafSrc.seek(pointer);
rafDes.seek(pointer);

         // 一次性复制完整的一部分长度
byte[] buffer = new byte[(int) partLength];
int len = rafSrc.read(buffer);
rafDes.write(buffer, 0, len);
pointer = rafSrc.getFilePointer();
} catch (IOException e) {
System.out.println(e);
}
} public static long getPointer() {
return pointer;
}
}

--> 感觉第二种也完全是多余的啊,就是一种方法...

Java-->多线程复制(文件指针)的更多相关文章

  1. jAVA基础 提高文件复制性能之多线程复制文件

    利用IO流中的随机访问文件 RandomAccessFile 和文件通道 FileChanne 复制文件可大大提高文件的读写效率,在此基础上利用多线程复制文件使其性能更优.因线程的个数可根据文件的大小 ...

  2. JAVA多线程读写文件范例

    在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位作者写的基础上做了改良,但已不记得原文的地址.如果有知情者,烦请帖出地址,我在此文上加入 ...

  3. Java多线程下载文件

    package com.test.download;   import java.io.File; import java.io.InputStream; import java.io.RandomA ...

  4. JAVA实现复制文件夹

    package com.filetest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...

  5. java 多线程下载文件 以及URLConnection和HttpURLConnection的区别

    使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...

  6. Java实现复制文件或者文件夹

    拷贝一个文件的算法比较简单,当然,可以对它进行优化,比如使用缓冲流,提高读写数据的效率等. 话不多说直接上代码 import java.io.*; /** * 实现文件的拷贝 */ public cl ...

  7. java 多线程下载文件并实时计算下载百分比(断点续传)

    多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...

  8. Java 多线程查找文件中的内容

    学过了操作系统,突然不知道多线程有什么用了. 看了一下百度,发现多线程,可以提升系统利用率 在系统进行IO操作的时候,CPU可以处理一些其他的东西,等IO读取到内存后,CPU再处理之前的操作. 总之可 ...

  9. java多线程下载文件和断点下载

    多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; impor ...

  10. 最新---java多线程下载文件

    import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...

随机推荐

  1. 使用MediaPlayer和SurfaceView播放视频

    使用VideoView播放视频简单.方便,丹有些早期的开发者更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时 需要借助于Sur ...

  2. Js笔试题之返回只包含数字类型的数组

    如js123ldka78sdasfgr653 => [123,78,653] 一般做法 分析: 1.循环字符串每个字符,是数字的挑出来拼接在一起,不是数字的,就给他空的拼个逗号 2.将新字符串每 ...

  3. NAND驱动

    NAND FLASH是一个存储芯片 那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A" 问1. 原理图上NAND FLASH和S3C2440之间只有数据线,      ...

  4. jquery 取的单选按钮组的值

    <input type=”radio” name=”wholesale_one” id=”wholesale_one” value=”1″ />1箱起批<input type=”ra ...

  5. HDU 3377 插头dp

    题目大意: 从左上角走到右下角,每个点之多经过一次,取到所有路径上经过点的权值,求最大的权值之和,这里走到右下角就算停止了 这里有个思路是转化成熟悉的回路问题 在上方和右方最外围定义一圈权值为0 , ...

  6. RPI学习--wiringpi_API

    reference: https://projects.drogon.net/raspberry-pi/wiringpi/functions/ Functions (API) Some of the ...

  7. Unity4.3.3激活

    Unity4.X Win版本的破解方法: <ignore_js_op> 1.安装unity4.X,一路按提示下一步,要断网,直到激活运行软件后再联网2.将Unity 4.x Pro Pat ...

  8. Struts2 中EL表达式取值顺序

    pagecontext---->request---->Valuestack-root栈顶----->root栈底----->actioncontext map----> ...

  9. 2014年3月份第1周51Aspx源码发布详情

    Graphics创建饼图示例源码  2014-3-7 [VS2010]源码描述:这个程序是一个在c#中使用图形类用来创建饼图,此程序是用Graphics 类的DrawPie() 和 FillPie() ...

  10. sidePagination: "server"和responseHandler: responseHandler

    bootstrapTable()中有两个属性 一个是sidePagination,表示服务器分页,responseHandler:responseHandler 表示回应操作的rows和total 两 ...