`
xgcai
  • 浏览: 8649 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

多线程复制文件

阅读更多

 

 

记录一下多线程文件复制工具类、以后有需要可以拿来用。

存在一些问题:

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 单线程复制文件和多线程复制文件的比较

    Java 单线程复制文件和使用RandomAccessFile多线程复制文件的比较,对应博客地址为http://blog.csdn.net/zmichealchow/article/details/38687431

    文件夹遍历与多线程复制文件

    本项目"文件夹遍历与多线程复制文件"着重于五个关键知识点:文件夹非递归遍历、文件操作复制、多线程复制、线程互斥以及MFC非模态对话框的创建和销毁。下面将详细阐述这些知识点。 1. **文件夹非递归遍历**: 在...

    C++实现多线程文件复制.docx

    多线程文件复制是指在文件复制过程中,使用多个线程同时复制文件,以提高复制速度。这种技术可以充分利用多核CPU的计算能力,提高文件复制的效率。 二、C++实现多线程文件复制的方法 在C++中,可以使用...

    java多线程复制文件

    java多线程复制文件

    C语言八皇后及java多线程复制文件

    8*8的国际象棋上有八个皇后他们不能在同一行。同一列和斜对角和java中用多线程复制文件

    C#文件多线程复制代码

    在多线程复制文件时,如果无节制地创建线程,可能会导致系统资源过度消耗,甚至引起性能下降。因此,我们需要设定一个合理的最大线程数。这可以通过设置`ThreadPool.SetMaxThreads`来实现,同时配合`ThreadPool....

    Delphi多线程实现文件拷贝

    在文件拷贝场景中,多线程可以使得大文件的复制过程更加流畅,不会阻塞用户界面,提升用户体验。 在Delphi中,我们可以使用`TThread`类来创建和管理线程。`TThread`是VCL(Visual Component Library)框架中的一个...

    java多线程复制文件的实例代码

    Java多线程复制文件的实例代码详解 Java多线程复制文件的实例代码是Java编程语言中的一种高级技术,用于快速复制大文件。该技术通过多线程并发访问文件,提高了文件复制的速度和效率。在这个示例代码中,我们将详细...

    java小项目多线程多线程 复制文件 冒泡排序 群聊

    2. 复制文件:在Java中,可以使用`java.io`包中的`FileInputStream`和`FileOutputStream`进行文件复制。通过创建输入流对象读取源文件,然后通过输出流对象写入目标文件,实现文件内容的复制。另外,`java.nio`包...

    使用线程复制文件的改进

    在"使用线程复制文件的改进"这个程序中,开发者最初尝试利用临界区(Critical Section)来实现线程间的同步,但发现效果不尽如人意。于是,他们转向了事件(Event)作为新的同步机制,以期改善程序性能和并发控制。...

    FileCopy1.rar_多文件复制_多线程复制

    在IT行业中,多文件复制和多线程复制是提高效率的关键技术,特别是在处理大量数据时。本文将深入探讨“FileCopy1.rar”压缩包中所包含的“多文件复制_多线程复制”这一主题。 首先,让我们理解什么是多文件复制。在...

    一个多线程文件拷贝工具的实现(使用内存映射文件)

    一个多线程的文件拷贝工具的实现,文件操作接口使用了内存映射模型的方式实现,可以指定线程数量,可以在拷贝过程中查看整体的进度信息(进度、速度、剩余时间、已用时间),同时可以查看每个子线程对应的进度信息。...

    Qt + qml 多线程 实现文件复制 进度条显示复制进度

    在本文中,我们将深入探讨如何使用Qt和QML结合实现多线程的文件复制功能,并在复制过程中通过进度条实时显示进度。Qt是一个强大的C++框架,广泛用于开发跨平台的桌面、移动和嵌入式应用程序。QML是Qt的一个组成部分...

    FileCopy2.rar_MFC文件复制_mfc cwinthread_多线程复制_多线程类_文件复制MFC

    标题“FileCopy2.rar_MFC文件复制_mfc cwinthread_多线程复制_多线程类_文件复制MFC”暗示了这是一个使用MFC库,特别是CWinThread类来实现多线程文件复制的项目。CWinThread是MFC中的一个关键类,它代表了一个独立...

    基于c++的多线程拷贝技术

    多线程拷贝技术可以大大提高文件拷贝速度,特别是在拷贝大文件时。 多线程拷贝技术实现流程 1. 把一个文件分成 N 份,每个线程负责拷贝一份文件的某一部分。 2. 每个线程读取指定长度字节大小的内容,并将其写入到...

    C实现多线程进行文件复制

    使用C实现多线程进行文件复制,在VC++6.0中可以运行

    Python实现的文件多线程复制小工具(带用户界面)

    之前复制大文件需要很长时间,非常苦恼,于是花点时间搞了一个小工具可以多线程复制文件,2G的文件几秒可以复制完成。可以根据自己的硬件条件设置线程,建议设置2-10个线程。基本原理是分块复制,这个包中有源码和可...

    多线程操作共享文件.zip

    在IT领域,多线程操作共享文件是一项关键的技术,尤其在并发编程中。Delphi作为一款强大的面向对象的 Pascal 编程环境,提供了丰富的工具和类库来支持这样的任务。本压缩包“多线程操作共享文件.zip”显然是一个关于...

    多线程复制(日文版)

    多线程复制是一种高效的数据传输技术,特别是在处理大型文件或大量数据时,它能显著提高复制操作的速度。这种技术利用了计算机的多核处理器能力,将一个文件的复制任务分解成多个子任务,每个子任务在不同的线程中...

    多线程对文件读写操作(java)

    在Java编程中,多线程技术是提升程序执行效率的关键之一,特别是在进行文件读写操作时。本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在...

Global site tag (gtag.js) - Google Analytics