记录一下多线程文件复制工具类、以后有需要可以拿来用。
存在一些问题:
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
本项目"文件夹遍历与多线程复制文件"着重于五个关键知识点:文件夹非递归遍历、文件操作复制、多线程复制、线程互斥以及MFC非模态对话框的创建和销毁。下面将详细阐述这些知识点。 1. **文件夹非递归遍历**: 在...
多线程文件复制是指在文件复制过程中,使用多个线程同时复制文件,以提高复制速度。这种技术可以充分利用多核CPU的计算能力,提高文件复制的效率。 二、C++实现多线程文件复制的方法 在C++中,可以使用...
java多线程复制文件
8*8的国际象棋上有八个皇后他们不能在同一行。同一列和斜对角和java中用多线程复制文件
在多线程复制文件时,如果无节制地创建线程,可能会导致系统资源过度消耗,甚至引起性能下降。因此,我们需要设定一个合理的最大线程数。这可以通过设置`ThreadPool.SetMaxThreads`来实现,同时配合`ThreadPool....
在文件拷贝场景中,多线程可以使得大文件的复制过程更加流畅,不会阻塞用户界面,提升用户体验。 在Delphi中,我们可以使用`TThread`类来创建和管理线程。`TThread`是VCL(Visual Component Library)框架中的一个...
Java多线程复制文件的实例代码详解 Java多线程复制文件的实例代码是Java编程语言中的一种高级技术,用于快速复制大文件。该技术通过多线程并发访问文件,提高了文件复制的速度和效率。在这个示例代码中,我们将详细...
2. 复制文件:在Java中,可以使用`java.io`包中的`FileInputStream`和`FileOutputStream`进行文件复制。通过创建输入流对象读取源文件,然后通过输出流对象写入目标文件,实现文件内容的复制。另外,`java.nio`包...
在"使用线程复制文件的改进"这个程序中,开发者最初尝试利用临界区(Critical Section)来实现线程间的同步,但发现效果不尽如人意。于是,他们转向了事件(Event)作为新的同步机制,以期改善程序性能和并发控制。...
在IT行业中,多文件复制和多线程复制是提高效率的关键技术,特别是在处理大量数据时。本文将深入探讨“FileCopy1.rar”压缩包中所包含的“多文件复制_多线程复制”这一主题。 首先,让我们理解什么是多文件复制。在...
一个多线程的文件拷贝工具的实现,文件操作接口使用了内存映射模型的方式实现,可以指定线程数量,可以在拷贝过程中查看整体的进度信息(进度、速度、剩余时间、已用时间),同时可以查看每个子线程对应的进度信息。...
在本文中,我们将深入探讨如何使用Qt和QML结合实现多线程的文件复制功能,并在复制过程中通过进度条实时显示进度。Qt是一个强大的C++框架,广泛用于开发跨平台的桌面、移动和嵌入式应用程序。QML是Qt的一个组成部分...
标题“FileCopy2.rar_MFC文件复制_mfc cwinthread_多线程复制_多线程类_文件复制MFC”暗示了这是一个使用MFC库,特别是CWinThread类来实现多线程文件复制的项目。CWinThread是MFC中的一个关键类,它代表了一个独立...
多线程拷贝技术可以大大提高文件拷贝速度,特别是在拷贝大文件时。 多线程拷贝技术实现流程 1. 把一个文件分成 N 份,每个线程负责拷贝一份文件的某一部分。 2. 每个线程读取指定长度字节大小的内容,并将其写入到...
使用C实现多线程进行文件复制,在VC++6.0中可以运行
之前复制大文件需要很长时间,非常苦恼,于是花点时间搞了一个小工具可以多线程复制文件,2G的文件几秒可以复制完成。可以根据自己的硬件条件设置线程,建议设置2-10个线程。基本原理是分块复制,这个包中有源码和可...
在IT领域,多线程操作共享文件是一项关键的技术,尤其在并发编程中。Delphi作为一款强大的面向对象的 Pascal 编程环境,提供了丰富的工具和类库来支持这样的任务。本压缩包“多线程操作共享文件.zip”显然是一个关于...
多线程复制是一种高效的数据传输技术,特别是在处理大型文件或大量数据时,它能显著提高复制操作的速度。这种技术利用了计算机的多核处理器能力,将一个文件的复制任务分解成多个子任务,每个子任务在不同的线程中...
在Java编程中,多线程技术是提升程序执行效率的关键之一,特别是在进行文件读写操作时。本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在...