讲师中心 微信公众号
AI工具推荐 视频效率加速

Java初学者怎么实现文件上传与下载功能_IO流与网络传输实例

陌枫酱_9776

陌枫酱_9776

发布时间:2025-11-19 09:22:02

|

540人浏览过

|

来源于php中文网

原创

文件上传:客户端通过Socket发送文件名、大小和数据流,服务器接收并保存;2. 文件下载:服务器读取文件通过输出流发送,客户端接收并写入本地。

java初学者怎么实现文件上传与下载功能_io流与网络传输实例

Java初学者实现文件上传与下载功能,核心在于理解IO流操作和基础网络通信。虽然现在有Spring等框架简化了这些操作,但从底层掌握原理对打基础非常关键。下面通过简单的TCP协议+IO流方式,带你一步步实现一个基础的文件上传与下载示例。

1. 文件上传:客户端发送文件到服务器

文件上传的本质是客户端读取本地文件,通过网络输出流发送给服务器,服务器接收后保存到指定路径。

客户端代码(FileUploadClient.java):

使用Socket连接服务器,读取本地文件并通过输出流发送。

<font face="Courier New" size="2">import java.io.*;
import java.net.Socket;

public class FileUploadClient {
    public static void main(String[] args) {
        String serverIP = "127.0.0.1";
        int port = 8888;
        String filePath = "D:/test.jpg"; // 要上传的文件

        try (Socket socket = new Socket(serverIP, port);
             FileInputStream fis = new FileInputStream(filePath);
             DataOutputStream dos = new DataOutputStream(socket.getOutputStream())) {

            // 先发送文件名
            String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
            dos.writeUTF(fileName);

            // 发送文件大小
            File file = new File(filePath);
            dos.writeLong(file.length());

            // 发送文件内容
            byte[] buffer = new byte[4096];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                dos.write(buffer, 0, len);
            }
            dos.flush();
            System.out.println("文件已上传完成");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}</font>
服务器端接收代码(FileUploadServer.java):

服务器监听端口,接收文件名、大小和数据,并写入本地。

立即学习“Java免费学习笔记(深入)”;

linux-performance-analyzer
linux-performance-analyzer

Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。

下载
<font face="Courier New" size="2">import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class FileUploadServer {
    public static void main(String[] args) {
        int port = 8888;
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("服务器启动,等待连接...");
            Socket socket = serverSocket.accept();
            System.out.println("客户端已连接");

            DataInputStream dis = new DataInputStream(socket.getInputStream());

            // 接收文件名
            String fileName = dis.readUTF();
            System.out.println("接收文件:" + fileName);

            // 接收文件大小
            long fileSize = dis.readLong();

            // 保存文件
            FileOutputStream fos = new FileOutputStream("D:/" + fileName);
            byte[] buffer = new byte[4096];
            int len;
            long received = 0;

            while (received < fileSize && (len = dis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
                received += len;
            }

            fos.close();
            System.out.println("文件接收完成,大小:" + received + " 字节");
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}</font>

2. 文件下载:客户端从服务器获取文件

文件下载是服务器读取文件,通过网络流发送给客户端,客户端保存到本地。

客户端请求下载(FileDownloadClient.java):

向服务器请求某个文件名,接收并保存。

<font face="Courier New" size="2">import java.io.*;
import java.net.Socket;

public class FileDownloadClient {
    public static void main(String[] args) {
        String serverIP = "127.0.0.1";
        int port = 9999;
        String requestFileName = "demo.txt"; // 请求的文件名

        try (Socket socket = new Socket(serverIP, port);
             DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
             DataInputStream dis = new DataInputStream(socket.getInputStream())) {

            // 发送请求的文件名
            dos.writeUTF(requestFileName);

            // 接收服务器响应:是否存在
            String status = dis.readUTF();
            if (!status.equals("EXIST")) {
                System.out.println("文件不存在");
                return;
            }

            // 接收文件大小
            long fileSize = dis.readLong();
            FileOutputStream fos = new FileOutputStream("D:/" + requestFileName);

            byte[] buffer = new byte[4096];
            int len;
            long received = 0;

            while (received < fileSize && (len = dis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
                received += len;
            }

            fos.close();
            System.out.println("文件下载完成:" + received + " 字节");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}</font>
服务器提供下载(FileDownloadServer.java):

监听请求,查找文件,存在则发送文件内容。

<font face="Courier New" size="2">import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class FileDownloadServer {
    public static void main(String[] args) {
        int port = 9999;
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("下载服务器启动,等待请求...");
            Socket socket = serverSocket.accept();
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

            // 接收请求的文件名
            String fileName = dis.readUTF();
            File file = new File("D:/" + fileName); // 文件存储目录

            if (!file.exists()) {
                dos.writeUTF("NOT_EXIST");
                System.out.println("文件不存在:" + fileName);
            } else {
                dos.writeUTF("EXIST");
                dos.writeLong(file.length()); // 发送文件大小

                FileInputStream fis = new FileInputStream(file);
                byte[] buffer = new byte[4096];
                int len;
                while ((len = fis.read(buffer)) != -1) {
                    dos.write(buffer, 0, len);
                }
                fis.close();
                System.out.println("文件已发送:" + fileName);
            }

            dos.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}</font>

3. 关键点说明与注意事项

实现过程中有几个细节需要注意,避免常见错误。

  • 先传元信息:发送文件前,先传输文件名和大小,便于接收方准备资源。
  • 缓冲区大小:建议使用4096或8192字节的缓冲区,太大占用内存,太小影响效率。
  • 流的关闭顺序:使用try-with-resources自动管理资源,避免内存泄漏。
  • 路径分隔符:注意Windows用反斜杠,Linux用正斜杠,建议用File.separator或/代替。
  • 异常处理:网络中断、文件不存在等情况要捕获IOException并提示。

4. 扩展思路

这个例子是单次连接、单文件的简单模型。实际应用中可以考虑以下优化:

  • 使用多线程处理多个客户端同时上传/下载。
  • 加入文件校验(如MD5)确保完整性。
  • 支持断点续传:记录已传位置,下次继续。
  • 升级为HTTP协议,配合Servlet实现更通用的Web文件服务。
基本上就这些。通过手动操作IO流和Socket,你能清楚看到数据是怎么从一个地方传到另一个地方的。理解了底层机制,以后用框架时才不会一头雾水。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2151

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

417

2026.01.26

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

1091

2023.08.08

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3518

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1009

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

343

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

479

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

329

2026.02.06

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn