记录一下多线程文件复制工具类、以后有需要可以拿来用。
存在一些问题:
A.怎么根据文件大小确定最佳的线程数 B.文件读取 buffer 大小多少才适合???
/** * */ package com.demo.file; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.RandomAccessFile; import org.junit.Test; /** * @author rico * 多线程文件复制工具类 */ public class MultiThreadFileCopy { public static void main(String[] args) { //junit 断点好像调试不了线程/??/、? new MultiThreadFileCopy().testCopyFile(); } @Test public void testCopyFile() { //怎么根据文件大小确定最佳的线程数 int blocks = 3; //源文件和目标文件 String filePath = "F:/demo.log"; String outFilePath = "F:/demo-copy-multi.log"; try { File file = new File(filePath); long fileSize = file.length(); long blockSize = fileSize / blocks; //每个线程操作的文件大小 long lastBlockSize = fileSize % blockSize; //文件大小不能整除线程数,文件剩余的数据会被添加到最后一个线程中操作 System.out.println("###fileSize: " + fileSize); System.out.println("###blockSize: " + blockSize); System.out.println("###lastBlockSize: " + lastBlockSize); for(int i=0; i<blocks; i++) { if(i == blocks-1) { blockSize += lastBlockSize; } Runnable r = new CopyThread(filePath, outFilePath, i, blockSize, fileSize); new Thread(r).start(); } } catch (Exception e) { e.printStackTrace(); } finally { } } public class CopyThread implements Runnable { String filePath; String outFilePath; int block; long blockSize; long fileSize; public CopyThread(String filePath, String outFilePath, int block, long blockSize, long fileSize) { this.filePath = filePath; this.outFilePath = outFilePath; this.block = block; this.blockSize = blockSize; this.fileSize = fileSize; } @Override public void run() { FileInputStream fis = null; RandomAccessFile raf = null; try { System.out.println("####block: " + block *blockSize); fis = new FileInputStream(new File(filePath)); raf = new RandomAccessFile(new File(outFilePath), "rw"); fis.skip(block * blockSize); raf.seek(block * blockSize); //buffer 大小多少才适合??? byte[] bytes = new byte[1024 * 100]; int len = fis.read(bytes); long totalBlockSize = len; while(len > -1) { if(totalBlockSize < blockSize) { raf.write(bytes, 0, len); len = fis.read(bytes); } else if(totalBlockSize == blockSize) { raf.write(bytes, 0, len); len = -1; } else { if(totalBlockSize-len < blockSize) { int leftBlockSize = (int) (len - (totalBlockSize-blockSize)); raf.write(bytes, 0, leftBlockSize); len = -1; } } System.out.println("####totalBlockSize: " + totalBlockSize); System.out.println("####len: " + len); totalBlockSize += len; } } catch (IOException e) { e.printStackTrace(); } finally { try { if(fis != null) fis.close(); if(raf != null) raf.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
相关推荐
Java 单线程复制文件和使用RandomAccessFile多线程复制文件的比较,对应博客地址为http://blog.csdn.net/zmichealchow/article/details/38687431
8*8的国际象棋上有八个皇后他们不能在同一行。同一列和斜对角和java中用多线程复制文件
java多线程复制文件
改小程序主要练习: 1、文件夹非递归遍历 2、文件操作,实现对文件的复制 3、多线程复制文件 4、线程互斥(临界区) 5、MFC非模态对话框的创建和销毁
多线程 复制文件 冒泡排序 群聊
C++实现多线程文件复制.docx
程序“使用线程复制文件”用临界区;来同步线程。 结果不理想,这次使用事件来同步线程。
Delphi多线程实现文件拷贝, 自己写的,代码很规范。
一个多线程的文件拷贝工具的实现,文件操作接口使用了内存映射模型的方式实现,可以指定线程数量,可以在拷贝过程中查看整体的进度信息(进度、速度、剩余时间、已用时间),同时可以查看每个子线程对应的进度信息。...
C#多线程复制代码: 1.运用线程和线程池的知识 2.可以实现 限制线程的数量 进行上传 3.用到FileStream类的读写功能 总之 大家可以参考一下!
java多线程复制文件的实例代码,需要的朋友可以参考一下
本程序的功能为利用Windows标准多线程函数实现多线程文件复制。
使用C实现多线程进行文件复制,在VC++6.0中可以运行
RichCopy 可帮助你大量的复制文件,在较慢的网络中尤其适用。如果你只是复制少量的大文件,RichCopy将不能很好的提高传输的性能。但如果是复制大批量的小文件,RichCopy将使用多线程来大大缩短传输时间。据用户反馈...
基于c++的多线程拷贝技术。基于c++的多线程拷贝技术,包括实现流程和源代码程序。基于c++的多线程拷贝技术。
Qt 负责文件的读写 qml负责显示进度,文件读写在子线程中进行。代码可以直接运行。
该程序的功能为利用MFC的多线程类CWinThread实现多线程文件复制。
delphi多线程互斥操作共享文件,多个EXE,多进程多线程操作工程文件。新手推荐。
Java实现多线的文件复制(界面)。 可以选择复制文件的路径,和复制到某处的路径。可以选择线程数量。
多线程文件备份源码 项目描述 开发环境:VS2008 技术特点:多线程 功能描述:根据选择的目录,然后选择备份路径..该程序会根据选择目录的文件夹结构复制并且过滤文件到备份路径. 如果某一文件夹下的文件非常多的话,...