Java多线程实现文件上传下载

java实现大文件多线程上传案例 以上代码实现了将大文件分片上传的逻辑。通过使用线程池管理并发上传任务,每个任务负责上传一个片段。在上传过程中,通过随机访问文件方式,避免将整个文件加载到内存中,从而避免内存溢出的问题。当机器内存大小为4G,需要上传一个大小为50G的文件时,为了避免内存溢出,可以采用分片上传的方式,即将大文件切分成多个小片段进行并发上传。 阅读详情

在Java中实现多线程文件上传和下载可以提高文件传输的效率。

一、多线程文件上传

多线程文件上传通常包括以下步骤:

  1. 创建一个文件上传任务,将文件拆分成多个块,并为每个块创建一个线程进行上传。
  2. 在服务器端接收这些块并将它们组合成完整的文件。
  3. 确保所有线程都完成上传后才标记上传任务完成。
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

public class MultiThreadFileUpload {
    public static void main(String[] args) {
        String fileToUpload = "D:\path\file.txt";
        String serverUrl = "http://localhost:8080/upload";

        int numThreads = 4; // 设置线程数量

        FileUploader[] uploaders = new FileUploader[numThreads];

        try {
            File file = new File(fileToUpload);
            long fileSize = file.length();
            long chunkSize = fileSize / numThreads;

            for (int i = 0; i < numThreads; i++) {
                long startByte = i * chunkSize;
                long endByte = (i == numThreads - 1) ? fileSize - 1 : (i + 1) * chunkSize - 1;

                uploaders[i] = new FileUploader(file, serverUrl, startByte, endByte);
                uploaders[i].start();
            }

            // 等待所有线程完成上传
            for (int i = 0; i < numThreads; i++) {
                uploaders[i].join();
            }

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

class FileUploader extends Thread {
    private File file;
    private String serverUrl;
    private long startByte;
    private long endByte;

    public FileUploader(File file, String serverUrl, long startByte, long endByte) {
        this.file = file;
        this.serverUrl = serverUrl;
        this.startByte = startByte;
        this.endByte = endByte;
    }

    @Override
    public void run() {
        try {
            URL url = new URL(serverUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/octet-stream");
            connection.setRequestProperty("Range", "bytes=" + startByte + "-" + endByte);

            FileInputStream fileInputStream = new FileInputStream(file);
            fileInputStream.skip(startByte);

            OutputStream outputStream = connection.getOutputStream();
            byte[] buffer = new byte[4096];
            int bytesRead;

            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            fileInputStream.close();
            outputStream.close();

            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_PARTIAL) {
                System.out.println("上传成功: " + startByte + " - " + endByte);
            } else {
                System.out.println("上传失败: " + startByte + " - " + endByte);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上例子将文件分成多个块并使用不同的线程上传每个块,然后在服务器端将这些块组合成完整的文件。

二、多线程文件下载

  1. 获取要下载的文件的总大小。
  2. 创建多个线程,每个线程负责下载文件的一部分。
  3. 将所有下载的部分合并成完整的文件。
  4. import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.concurrent.CountDownLatch;
    
    public class MultiThreadFileDownload {
        public static void main(String[] args) {
            String fileUrl = "http://localhost:8080/download/file.txt";
            String destinationPath = "D:\path\file.txt";
            int numThreads = 4; // 设置线程数量
    
            try {
                URL url = new URL(fileUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                int fileSize = connection.getContentLength();
    
                CountDownLatch latch = new CountDownLatch(numThreads);
                long chunkSize = fileSize / numThreads;
    
                for (int i = 0; i < numThreads; i++) {
                    long startByte = i * chunkSize;
                    long endByte = (i == numThreads - 1) ? fileSize - 1 : (i + 1) * chunkSize - 1;
    
                    FileDownloader downloader = new FileDownloader(fileUrl, destinationPath, startByte, endByte, latch);
                    new Thread(downloader).start();
                }
    
                latch.await(); // 等待所有线程完成下载
                System.out.println("文件下载完成");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    class FileDownloader implements Runnable {
        private String fileUrl;
        private String destinationPath;
        private long startByte;
        private long endByte;
        private CountDownLatch latch;
    
        public FileDownloader(String fileUrl, String destinationPath, long startByte, long endByte, CountDownLatch latch) {
            this.fileUrl = fileUrl;
            this.destinationPath = destinationPath;
            this.startByte = startByte;
            this.endByte = endByte;
            this.latch = latch;
        }
    
        @Override
        public void run() {
            try {
                URL url = new URL(fileUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestProperty("Range", "bytes=" + startByte + "-" + endByte);
    
                InputStream inputStream = connection.getInputStream();
                RandomAccessFile outputFile = new RandomAccessFile(destinationPath, "rw");
                outputFile.seek(startByte);
    
                byte[] buffer = new byte[4096];
                int bytesRead;
    
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputFile.write(buffer, 0, bytesRead);
                }
    
                inputStream.close();
                outputFile.close();
                latch.countDown(); // 通知主线程下载完成
    
                System.out.println("下载完成: " + startByte + " - " + endByte);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    以上例子将文件分成多个块,并使用不同的线程下载每个块,然后将这些部分合并成完整的文件。注意使用RandomAccessFile来确保多线程下载时不会覆盖文件的其他部分。另外,使用CountDownLatch来等待所有线程完成下载。

Java文件上传与下载,多线程高并发 2)使用类介绍。 阅读详情

相关推荐

TCP协议利用多线程实现——文件的上传、下载

文件的上传指的是:客户端将本地的文件发送到服务器端,然后服务器端将接收到的内容存储到本地。 文件的下载即是一个相反的过程:服务器将文件发送给客户端,客户端将接收的文件下载到本地。 上传和下载的过程,方法上没有什么区别。 下面用多线程的方式来实现文件的上传过程。 package zal.demo02_upLoad; import java.io.FileOutputStream; import ja...

zal881124的博客 933

【文件上传】接口优化之多文件多线程异步上传

【文件上传】多线程异步上传文件。

weixin_46361305的博客 4331

java 大作业报告

一、项目描述     文件上传下载应用程序   二、功能分析 1、服务器端实现了多线程技术; 2、客户端可以向服务器上传所有格式的文件; 3、客户端可以获取服务器上的文件列表; 4、服务器上的文件列表使用Jlist组件显示; 5、客户端可以从获取到的列表中选择文件名,并下载到本地文件夹内; 三、程序设计     1、项目中包含两个包,一个Server包,一个Client包;

向远方·无以言退 2927

【Java 基础篇】Java多线程实现文件上传详解

本文介绍了如何使用Java多线程实现文件上传功能。通过将文件切割为多个块并使用多线程同时上传,可以提高文件上传的效率。同时,服务器端需要接收和重组这些块数据以还原原始文件。希望本文对您理解文件上传的原理以及如何实现多线程文件上传有所帮助。如果您有任何问题或疑问,请随时提出。

繁依Fanyi的博客 3553

Java文件上传与下载核心技术实现

本文还有配套的精品资源,点击获取 简介:在Java Web应用开发中,文件上传与下载是常见的需求。通过使用Servlet 3.0+的 Part 接口和HTTP响应头处理,可以实现文件的上传与下载功能。为了提升应用的安全性、性能和用户体验,需要采取一系列措施,例如对上传文件大小和类型的限制,分块处理大文件,使用缓存和CDN服务,以及合理配置Eclipse IDE...

weixin_28850145的博客 1269

Java多线程设计模式上传文件

Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件

java 文件上传(使用多线程)

1、对一个文件babse64加密,再上传到指定位置。使用多线程可以提高文件上传速度。 2、java 实现: @Slf4j public class FileUploadDemo { public static void uploadFiles(String localFilePath,String uploadFile){ InputStream is = null; FileOutputStream os = null; //获取上传文件的ba.

weixin_54951878的博客 4805

java多线程文件传输(基于swing)

基于socket的多线程文件传输,包中含有整个工程的源代码(有详细的注解) 和 直接运行的打包生成的jar文件 。其中swing界面有待优化.....

Java中使用多线程实现文件上传和下载

上一篇中说的是单线程实现的文件上传,接下来说说多线程实现文件上传 首先搞清楚应该是对于服务器端的多线程,因为是多个客户端同时向服务器端上传 编写客户端代码,先读取本地文件,然后给服务器端发送数据,最后接收一下是否上传成功 //实现图片上传的客户端 Socket socket = new Socket(InetAddress.getByName("10.0.185.144"),

dly的博客 1万+

国产麒麟系统各版本镜像下载

以上各链接均为迅雷下载,禁止商业用途!

2302_79474754的博客 6127

ATE自动化测试设备:硬件与软件的完美协同

本文深入解析了ATE自动化测试设备如何通过硬件与软件的完美协同,实现高效、精准的电子产品测试。文章详细阐述了ATE系统的硬件架构(如测试控制器、仪器模块、开关矩阵)与软件层次(如测试管理、仪器控制、数据分析),并结合实战案例,揭示了软硬件协同设计在提升测试效率与可靠性中的关键作用。

weixin_29218509的博客 167

java多线程excel上传_C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

废话不多说了,直接给大家贴代码,具体代码如下所示://打开Excel文件,转换为DataTableDataTable dtExcel;private void OpenFile(){OpenFileDialog dialog = new OpenFileDialog();dialog.Filter = "Microsoft Excel files(*.xls)|*.xls;*.xlsx"; //筛...

weixin_30035343的博客 323

Windows 10/11一键搞定HDF5文件查看:HDFView 3.4.1免配置安装指南(附中文路径避坑技巧)

本文详细介绍了HDFView 3.4.1在Windows 10/11上的免配置安装方法及中文路径优化技巧。作为HDF5文件查看的专业工具,HDFView 3.4.1简化了安装流程,提升了科研数据处理效率,特别适合遥感、气象等领域的研究人员使用。

qsc9012345的博客 1146

用java实现ftp的多线程下载

1:字节流结构:每次发送12+1024个字节其中,前七个字节字节表示命令第七到第十二个字节表示后面1024字节中的有效字节的长度例如一帧中前12个字节的内容为"UPFILEN00012"表示要上传文件名,文件名的长度是12。那么程序就在后面的1024个字节中去12个字节,在把它转换为字符串,作为要上传的文件名。2:命令结构Server端:DISCONN:断开连接LSFILES:发送当前目录文件列表

duanxd的专栏 8377

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1632

RFSoC应用XCZU47DR八发八收FPGA设计方案

本文介绍了基于Xilinx XCZU47DR RFSoC芯片的八发八收FPGA设计方案。该方案采用集成射频数据转换器的SoC架构,支持8路14bit ADC(5GSPS)和8路14bit DAC(9.85GSPS),可直接处理5GHz以下射频信号。硬件设计包含高性能输入缓冲器、QMC校正和复杂混频器,适用于5G/6G通信、雷达、卫星通信等领域。文章详细阐述了ADC/DAC子系统参数,包括通道配置、采样率、带宽等特性,并提供了FPGA顶层模块的硬件接口设计,展示了多通道数据收发处理能力。该方案无需外置混频器,

toonyhe的博客 1786

Apache FTP多线程文件上传、下载、修改文件名、删除

请参考上一篇章:Apache FTP文件上传、下载、修改文件名、删除

纸上得来终觉浅,绝知此事要躬行 6303

诊断CAPL自动化(5) ——没有CANdela,无法编辑cdd数据库文件,也能轻松完成诊断测试

🍅我们知道cdd数据库文件,是CANoe测试环境的重要组件,它可以让我们更加轻松的完成诊断测试工作;但是创建和编辑cdd文件是需要CANdela 来完成的,一个 liscense 就要将近二十万,成本确实高🍅特别是在处理22/2E/31服务的时候,频繁的增加功能,可能需要频繁的用CANdela 修改CDD,我测试开发过程中,一般很少去修改cdd,有这个时间,纯手撸也开发完了,就一个CANdela,鬼知道此时此刻到了谁手里,我也懒得去找。🍅演示软硬件环境;目录📘前言。

蚂蚁小兵 5756

java 简单的文件上传下载服务器模型(IO + 多线程)

最近学习网络编程,多线程,IO等知识,综合这些知识写了个简单的文件上传下载服务器模型,目前是基于IO+多线程的方式,比较简单,异常基本没有处理,将就一下,哈 哈。后续会将其改造为NIO的方式,最后再将其改造成NIO+多线程的方式,敬请期待,^_^ 服务器端基于Java IO+多线程 package com.myftp.server; import java.net.InetSocketAd

pingnanlee的专栏 3728

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

天天酷科研的博客 1114

Python爬虫实战:如何爬取12306列车信息

本文介绍了如何使用Python编写爬虫,抓取12306列车信息。我们讲解了如何分析12306的列车数据接口,如何发送HTTP请求,解析返回的JSON数据,并将数据保存到本地文件中。我们还讨论了如何绕过反爬虫机制,如使用随机User-Agent和设置请求延时。通过这个实战项目,你应该掌握了如何爬取并解析来自公共API的数据,同时提高了你的爬虫技能。这些技能不仅适用于12306列车信息抓取,也可以广泛应用于其他需要抓取JSON数据的网站。

2201_76125261的博客 1922

Java实现文件上传和下载的方法详解

Java实现文件上传和下载的方法详解,Java实现文件上传和下载解决方案,Java实现文件上传和下载思路,Java实现文件上传和下载源码,Java实现文件上传和下载实例,Java实现文件分块上传和下载,Java实现文件分片上传和下载,Java实现文件切片上传和下载,Java实现文件加密上传和下载,Java实现文件夹上传和下载,要求支持文件夹的上传下载,支持断点续传,支持加密传输,端到端的加密传输,上传过程中数据加密,下载过程中数据加密,下载后自动解密,上传支持加密存储,

weixin_45525177的博客 724

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringMVC基于注解使用:上传&下载

​。

kkkkkkkok的博客 719

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

简易文件上传下载器(socket+多线程+io)

文章目录客户端上传下载具体实现服务端线程助手服务端上传下载具体实现 客户端上传下载具体实现 package cn.tedu.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutput...

Logan_addoil的博客 468

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java高性能文件上传下载系统实战:异步任务与多线程结合代码解析

Java结合异步任务和多线程,可构建高性能文件上传下载系统。通过批量传输、异步执行和线程池优化,能够在高并发文件传输场景下实现低延迟、高吞吐量。实践这些方法,开发者可以构。

2501_94180176的博客 303

java实现FTP的上传及下载

//下载文件 public static void readFile(){         // 指定本地写入文件           /*/D:/jiashan/jstq/target/classes/data/shzs/58452ZhiShu.txt*/         String localPath=FileUtils.getContextPath()+shzsTxtFolder+

追风少年的博客 5215
上一篇: SpringBatch Writer详解
下一篇: 面试系列 - Java内存泄漏问题排查
境里婆娑
境里婆娑 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 1万+粉丝 300原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值