首页 > 编程语言 >java本地文件多线程拷贝

java本地文件多线程拷贝

时间:2023-10-03 10:23:55浏览次数:47  
标签:文件 startByte java String long 线程 拷贝 多线程

简单介绍:本地文件多线程拷贝是指通过多个线程同时进行文件复制操作。传统的文件复制操作往往是串行进行的,当需要复制单个大文件时,复制速度往往会比较慢。而采用多线程进行文件拷贝可以提高效率。通过同时创建多个线程,每个线程负责复制不同的文件或者不同的文件片段,可以充分利用计算机资源,加快文件复制速度。

 

核心思想:创建三个用于拷贝文件的线程,通过随机访问文件对象的seek方法和其他必要的读写流,来设置每个线程在拷贝文件中开始写和在被拷贝文件的开始读的位置。

 

核心代码:

public class Test {
    private static final String FILE_PATH = "被拷贝文件的路径";
    private static final String SAVE_PATH = "拷贝文件的路径";
    private static final int NUM_THREADS = 3; //假设由三个线程下载文件

    public static void main(String[] args) {
        try {
            File file = new File(FILE_PATH);
            long fileSize = file.length();
            long chunkSize = fileSize / NUM_THREADS;

            for (int i = 0; i < NUM_THREADS; i++) {
                //设定三个线程在文件里下载的起始位置
                long startByte = i * chunkSize;
                long endByte = (i == NUM_THREADS - 1) ? fileSize - 1 : (i + 1) * chunkSize - 1; /*条件只对于最后一个thread为真,此时直接将文件的最后一个字节设置最后一个线程的末索引,应付文件length除以三不能整除的情况*/

                Thread mergerThread = new MergerThread(FILE_PATH, SAVE_PATH, startByte, endByte);
                mergerThread.start();
            }

            System.out.println("合并文件完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MergerThread extends Thread {
    private String filePath;
    private String savePath;
    private long startByte;
    private long endByte;

    public MergerThread(String filePath, String savePath, long startByte, long endByte) {
        this.filePath = filePath;
        this.savePath = savePath;
        this.startByte = startByte;
        this.endByte = endByte;
    }

    public void run() {
        try {
            RandomAccessFile inputFile = new RandomAccessFile(filePath, "r");
            RandomAccessFile outputFile = new RandomAccessFile(savePath, "rw");
            //设置读写文件的起始位置
            inputFile.seek(startByte);
            outputFile.seek(startByte);

            byte[] buffer = new byte[1024 * 1024];   //设置1MB缓冲区,存储读取的数据并写到目标文件
            int bytesRead; //用于保存读出的数据有多少的变量
            long bytesToRead = endByte - startByte + 1; //这个线程还剩多少字节需要读
            //while里面,要判断read方法返回了-1并同时获取已经读了多少字节
            while (bytesToRead > 0 && (bytesRead = inputFile.read(buffer, 0, (int)  bytesToRead)) != -1) {
                outputFile.write(buffer, 0, bytesRead);
                bytesToRead -= bytesRead;
            }

            inputFile.close();
            outputFile.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

 

标签:文件,startByte,java,String,long,线程,拷贝,多线程
From: https://www.cnblogs.com/xialang/p/17740836.html

相关文章

  • 三个Java入门项目
    Java实现简单计算器参考链接......
  • redis7源码分析:redis 多线程模型解析
    多线程模式中,在main函数中会执行InitServerLastvoidInitServerLast(){bioInit();//关键一步,这里启动了多条线程,用于执行命令,redis起名为IO线程initThreadedIO();set_jemalloc_bg_thread(server.jemalloc_bg_thread);server.initial_memory_usage=......
  • JAVA--异常
    什么是反射?可以从类里面将该类的成员方法成员变量,构造方法的信息给拿出来使用可以获取成员变量,构造方法,成员方法的所有信息.学习反射应该学习如何获取和解剖获取class对象的三种方式在源代码阶段使用Class.forName("全类名");(最常用)在加载阶段使用A.class(一......
  • Java---异常
    14.1概念在日常编码中或多或少都会现一些问题,这些问题有的是错误和有的是异常(不正常)。日常编码这种问题分为两类:1、错误Error2、异常Exception错误在jvm,硬件层面报出的问题异常是代码运行层面bug:1、编码语法错误(很好解决)2、运行时异常这种异常也好解决,根据提示去做修......
  • java对浮点数保留合适的位数
    importjava.text.DecimalFormat;publicclassMain{publicstaticvoidmain(String[]args){doublenumber=3.1415926;DecimalFormatdf=newDecimalFormat("#.0#");Stringformatted;if(nu......
  • Java面试突击题库
                 ......
  • java——mysql随笔——SQL优化&锁
               插入数据SQL优化:              主键优化:                                    order  by优化:       ......
  • Java基础:meta-info.md文件的作用
    作用概述meta-info.md文件通常是一个用于提供关于软件包或项目的元信息的文本文件。它可以包含各种类型的信息,具体取决于项目的需求和约定。一些常见的元信息包括:项目说明:描述项目的目的、功能、特点等。这可以是一个简短的描述或详细的文档。版本信息:指定软件包或项目的版本号、......
  • JavaScript框架:构建交互性、现代化Web应用的利器
    ......
  • javascript: Sorting Algorithms
     //SortingAlgorithmsintJavaScripthttps://www.geeksforgeeks.org/sorting-algorithms//***fileSort.js*1.BubbleSort冒泡排序法*@paramarry*@paramnszie*/functionBubbleSort(arry,nszie){vari,j,temp;varswapped;for(i=0;i......