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

---> 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. InLineHookSSDT

    //当Ring3调用OpenProcess //1从自己的模块(.exe)的导入表中取值 //2Ntdll.dll模块的导出表中执行ZwOpenProcess(取索引 进入Ring0层) //3进入R ...

  2. C# SQLiteDataReader获得数据库指定字段的值

    获得数据库指定字段的值,赋给本地变量 (1)如下,获得userinfo数据表里的字段"userid"."orgid", string userid=" ...

  3. [vijos P1112] 小胖的奇偶

    第一次看到这题怎么也不会想到是并查集题目…星期五第一次看到这题,到今天做出来,实在是废了好多功夫.看了很多人的解题都有same和diff数组,我也写了,后来发现不对啊两个数组的话find函数怎么写呢? ...

  4. Memcache 详解

    这里收集了经常被问到的关于memcached的问题 一般的问题 什么是memcached? 从哪获得memcached? 怎么安装memcached? 哪些平台可以运行memcached? 什么情况下 ...

  5. RPI学习--环境搭建_串口连接

    有两种, 一种是通过MAX2323芯片连接的串口,要接VCC为芯片供电. 另一种是通过PL2302芯片连接的USB,可不接VCC,用电脑USB口为芯片供电. 下面以通过MAX2323方式为例. 1,V ...

  6. 通过使用ScriptManager.RegisterStartupScript,呈现后台多次使用alert方法

    在前台HTML中加入alert或者confirm,相信大家已经非常熟悉并且经常使用: <div onclick="alert('hello')">按钮1</div ...

  7. Opencv中在图片上显示文本

    1.cvPutText函数(在图像中加入文本) void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* fon ...

  8. [windows驱动]标准驱动例程

    [注]routine:例行程序. 1.标准驱动例程简介: 每一个内核态驱动程序都是由一系列系统定义的,标准的驱动例程组成.内核态驱动在这些标准例程中通过调用系统提供的驱动支持函数处理I/O请求包.为了 ...

  9. iOS 网络判定

    由于流量精灵需要在 蜂窝数据或者3G 环境下进行流量监控因此需要判定3G 环境 将 SystemConfiguration.framework 添加进工程: 引入头文件 #import <Sys ...

  10. 第三课 Spinner的使用

    Spinner的表现形式相当于C#的ComboBox,样子如下图: 但选择项的添加方式相当不一样,必须使用数据适配器,上例子. Layout--Main.axml <?xml version=& ...