`
itxdl
  • 浏览: 26828 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多
 jAVA基础 提高文件复制性能之多线程复制文件

利用IO流中的随机访问文件 RandomAccessFile 和文件通道 FileChanne 复制文件可大大提高文件的读写效率,在此基础上利用多线程复制文件使其性能更优。因线程的个数可根据文件的大小及需求而定。其大概原理是根据给定的线程个数,将文件分段,每个线程负责的数据大小=文件长度/线程个数,将不能除尽的部分留给最后一段文件所分配的线程处理。以下是实现代码及自己理解的注释,多有偏差请见谅。下面是兄弟连java培训总结的一些代码:供参考。
  程序实现类代码:
  import java.io.RandomAccessFile;
  import java.nio.channels.FileChannel;
  import java.nio.channels.FileLock;
  //定义一个CopyThread类继承Thread类
  public class CopyThread extends Thread{
  private String srcPath;//原文件地址
  private String destPath;//目标文件地址
  private int start, end;//start指定起始位置,end指定结束位置
  //构造CopyThread方法
  public CopyThread(String srcPath, String destPath, int start, int end) {
  this.srcPath = srcPath;//要复制的源文件路径
  this.destPath = destPath;//复制到的文件路径
  this.start = start;//复制起始位置
  this.end = end;//复制结束位置
  }
  //重写run()方法
  public void run() {
  try {
  //创建一个只读的随机访问文件
  RandomAccessFile in = new RandomAccessFile(srcPath, "r");
  //创建一个可读可写的随机访问文件
  RandomAccessFile out = new RandomAccessFile(destPath, "rw");
  in.seek(start);// 将输入跳转到指定位置
  out.seek(start);// 从指定位置开始写
  FileChannel inChannel = in.getChannel(); //文件输入通道
  FileChannel outChannel = out.getChannel();//文件输出通道
  //锁住需要操作的区域,false代表锁住
  FileLock lock = outChannel.lock(start, (end-start), false);
  //将字节从此通道的文件传输到给定的可写入字节的outChannel通道。
  inChannel.transferTo(start, (end-start), outChannel);
  lock.release();//释放锁
  out.close();//从里到外关闭文件
  in.close();//关闭文件
  } catch (Exception e) {
  e.printStackTrace();
  }
  }
  }
  测试类代码:
  import java.io.File;
  public class TestMain {
  public static void main(String[] args) {
  //要复制的源文件路径
  String srcPath = "F:\\sun\\上课笔记\\aa.txt";
  String destPath = "F:\\sun\\上课笔记\\aa复件.txt";
  // 获得源文件长度
  File f = new File(srcPath);
  long len = f.length();
  int count = 3;// 需要的线程数
  int oneNum = (int) (len / count);//每个线程负责的文件长度,强制转换成int类型
  //用for循环处理划分文件的第一部分跟第二部分(循环次数可根据定义的线程数调整)
  for (int i = 0; i < count - 1; i++) {
  //oneNum * i 起始位置, oneNum * (i + 1)要复制数据的长度
  CopyThread ct = new CopyThread(srcPath, destPath, oneNum * i,oneNum * (i + 1));
  ct.start();
  }
  //文件长度不能整除的部分放到最后一段处理
  CopyThread ct = new CopyThread(srcPath, destPath, oneNum * (count-1),(int)len);
  ct.start();
  }
  }

分享到:
评论

相关推荐

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

    综上所述,多线程在Java文件读写操作中能够显著提升效率,但同时也带来了线程安全、资源管理和异常处理等挑战。合理利用Java提供的并发工具和I/O库,结合性能调优,可以使程序在处理大量文件操作时更加高效和稳定。

    【IT十八掌徐培成】Java基础第16天-02.文件多线程复制.zip

    文件多线程复制.zip”聚焦于Java中的一个重要概念:多线程文件复制。这个主题涉及到Java并发编程和I/O操作的基础知识,对于任何想深入学习Java的开发者来说都是不可或缺的。 首先,我们来了解什么是多线程。在...

    文件复制——多线程

    在IT行业中,多线程是提高程序执行效率和并发能力的重要技术之一,尤其在处理大量数据,如文件复制时,其优势更为明显。本话题将深入探讨如何利用多线程来实现高效的文件复制。 首先,我们需要理解什么是多线程。在...

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

    另外,`java.nio`包提供了更高效的通道(Channel)和缓冲区(Buffer)机制,可以用于异步文件复制,提高性能。 3. 冒泡排序:冒泡排序是一种基础的排序算法,通过不断地交换相邻的未排序元素,逐步将最大(或最小)...

    监听文件下文件发生变化时复制文件到另一个文件夹

    本案例的标题和描述提到了“监听文件下文件发生变化时复制文件到另一个文件夹”,这通常涉及到文件系统的观察者模式(Observer Pattern)和多线程技术。 首先,我们需要理解“监听文件”这一概念。在操作系统层面,...

    java 使用IO流实现文件的复制

    NIO引入了通道(Channel)和缓冲区(Buffer)的概念,可以实现多线程间的零拷贝,提高文件复制效率。例如,使用`FileChannel`进行文件复制的代码如下: ```java import java.io.IOException; import java.nio....

    java实现文件的复制

    1. **并行处理**:Stream API支持并行流(Parallel Streams),这使得在多核处理器环境下,数据处理可以被分割为多个线程并行执行,大大提高了效率。 2. **优化的内部实现**:Java 8的Stream API内部实现进行了优化...

    java文件复制

    综上所述,这个"java文件复制"项目涵盖了Java I/O流的使用、GUI设计、异常处理等多个核心知识点,为用户提供了一种实用的文件复制解决方案。通过学习和实践,开发者可以深入理解Java文件操作和GUI编程。

    java 文件管理器

    4. **多线程**:为了实现文件操作的并行性,开发者可能使用了Java的多线程机制。这使得用户可以在进行耗时操作(如大文件复制)时仍可以继续使用其他功能,提高了用户体验。 5. **事件监听**:在GUI应用中,按钮...

    java基础思维导图 全套 到多线程 思维导图

    本资料“java基础思维导图 全套 到多线程 思维导图”涵盖了从Java语言的基本语法到多线程的高级主题,为学习者提供了全面的学习路径。 首先,我们要了解Java的基础语法,这是学习任何编程语言的第一步。Java的基础...

    使用线程复制文件

    本例中的"使用线程复制文件"是一个典型的多线程编程示例,主要目标是利用两个线程同时进行文件复制,以提高效率。下面我们将详细探讨这个主题。 一、线程基础 线程是操作系统分配CPU时间的基本单位,一个进程中可以...

    JAVA 的IO流的文件复制

    - 文件复制过程中应考虑到并发控制,特别是在多线程环境中,避免文件操作冲突。 总结,Java的IO流提供了强大而灵活的文件操作功能,通过`FileInputStream`和`FileOutputStream`可以实现文件的复制,而通过递归调用...

    java 文本文件 支持新建,打开,复制,剪切...

    复制文件通常涉及使用两个文件流:一个用于读取源文件,另一个用于写入目标文件。可以使用`BufferedInputStream`和`BufferedOutputStream`来提高性能。读取源文件的每一行或每个字符,并将其写入目标文件,直到完成...

    Java实现文件复制,File文件读取,写入,IO流的读取写入

    1. **Java文件复制** 文件复制通常涉及读取源文件内容并将其写入目标文件。在Java中,我们可以使用`java.io`包中的`BufferedReader`和`BufferedWriter`或者`FileInputStream`和`FileOutputStream`来实现。例如,...

    多线程读取DBF文件

    本篇文章将聚焦于如何使用Java的NIO(New Input/Output)包中的RandomAccessFile类来实现多线程读取DBF文件,这在处理大型文件时能显著提升效率。 1. **Java NIO介绍** Java NIO是一个非阻塞I/O模型,提供了与标准...

    基于Java向zip压缩包追加文件

    - 考虑使用多线程并行处理文件,尤其是当处理大量文件时,可以显著提升速度。 7. **异常处理**: 编程时需注意捕获和处理可能发生的异常,如`IOException`,确保程序在出现错误时能正确清理资源并给出反馈。 ...

    Java多线程读取大文件

    总之,Java多线程读取大文件是通过文件分区、内存文件映射和NIO技术来提升效率,同时通过多线程协作和合理的资源管理确保程序的稳定性和性能。这种策略尤其适用于需要高效处理大量数据的场景,如日志分析、数据导入...

    java实现的文件管理系统

    7. **多线程**:如果文件管理系统需要支持大量文件操作,可能会用到多线程以提高性能。Java的`Thread`类和`ExecutorService`可以实现并发处理。 8. **用户界面**:为了方便用户交互,文件管理系统通常会有一个图形...

    Java多线程优化百万级数据

    在Java编程中,多线程是提升程序性能和并发处理能力的重要手段,特别是在处理大量数据时,如数据库的百万级数据读取。本篇将深入探讨如何利用Java多线程技术来优化这种高负载场景。 首先,理解Java多线程的基础至关...

Global site tag (gtag.js) - Google Analytics