Java使用NIO优化IO实现文件上传下载功能

我来为您讲解一下“Java使用NIO优化IO实现文件上传下载功能”的完整攻略。

概述

Java NIO library 是Java语言提供的一种基于缓冲区、非阻塞的IO,使得Java应用程序能够快速轻便地处理并发客户端请求。使用Java NIO实现文件上传下载功能的好处是可以大大提高系统的吞吐量、降低系统的IO延迟,而且还能避免阻塞线程,提高服务器的并发能力。

Java NIO

Java NIO的核心概念包括通道(Channel)、缓冲区(Buffer)、选择器(Selector)和文件锁(FileLock)。其中,通道负责连接数据源,缓冲区负责存储数据,选择器负责监听通道的事件,文件锁提供了文件级别的共享锁。

文件上传实现

  1. 创建文件上传的服务器端代码
import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;

public class NioServer {

    public static void main(String[] args) throws Exception {

        java.net.ServerSocket serverSocket = new java.net.ServerSocket(8888);

        System.out.println("NioServer has started");

        while (true) {

            SocketChannel socketChannel = SocketChannel.open();
            java.net.Socket socket = serverSocket.accept();
            System.out.println(socket.getInetAddress() + " is connected");

            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (socketChannel.read(buffer) != -1) {
                buffer.flip();
                Charset charset = Charset.forName("UTF-8");
                String message = new String(buffer.array(), 0, buffer.limit(), charset);
                System.out.println(message);
                buffer.clear();
            }

            String fileName = "C:\\tmp\\fileupload\\temp.log";
            FileChannel outChannel = new FileOutputStream(fileName).getChannel();
            ByteBuffer buffer1 = ByteBuffer.allocate(1024);

            long fileSize = socketChannel.read(buffer1);
            while (fileSize > 0) {
                buffer1.flip();
                outChannel.write(buffer1);
                buffer1.clear();
                fileSize = socketChannel.read(buffer1);
            }

            File file = new File(fileName);
            System.out.println(file.getName() + "has been saved at: " + file.getAbsolutePath());
            outChannel.close();
            socketChannel.close();
        }
    }
}
  1. 创建文件上传的客户端代码
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;

public class NioClient {

    public static void main(String[] args) throws Exception {

        String filePath = "C:\\tmp\\fileupload\\test.log";
        File file = new File(filePath);
        String fileName = file.getName();

        SocketChannel socketChannel = SocketChannel.open(new java.net.InetSocketAddress("localhost", 8888));

        Charset charset = Charset.forName("UTF-8");
        ByteBuffer buffer1 = ByteBuffer.allocate(1024);
        buffer1.put(fileName.getBytes(charset));
        buffer1.flip();
        socketChannel.write(buffer1);

        FileChannel inChannel = new FileInputStream(file).getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        while (inChannel.read(buffer) != -1) {
            buffer.flip();
            socketChannel.write(buffer);
            buffer.clear();
        }

        inChannel.close();
        socketChannel.close();
    }
}

文件下载实现

  1. 创建文件下载的服务器端代码
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;

public class NioServer {

    public static void main(String[] args) throws Exception {

        java.net.ServerSocket serverSocket = new java.net.ServerSocket(8888);

        System.out.println("NioServer has started");

        while (true) {

            SocketChannel socketChannel = SocketChannel.open();
            java.net.Socket socket = serverSocket.accept();
            System.out.println(socket.getInetAddress() + " is connected");

            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (socketChannel.read(buffer) != -1) {
                buffer.flip();
                Charset charset = Charset.forName("UTF-8");
                String message = new String(buffer.array(), 0, buffer.limit(), charset);
                System.out.println(message);
                buffer.clear();
            }

            String filePath = "C:\\tmp\\filedownload\\" + message.trim();
            File file = new File(filePath);
            if (!file.exists()) {
                System.out.println("File does not exist");
            } else {
                FileChannel inChannel = new FileInputStream(file).getChannel();
                ByteBuffer buffer1 = ByteBuffer.allocate(1024);
                int bytesRead;
                while ((bytesRead = inChannel.read(buffer1)) != -1) {
                    buffer1.flip();
                    socketChannel.write(buffer1);
                    buffer1.clear();
                }

                System.out.println(file.getName() + "has been downloaded from: " + file.getAbsolutePath());
                inChannel.close();
            }

            socketChannel.close();
        }
    }
}
  1. 创建文件下载的客户端代码
import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;

public class NioClient {

    public static void main(String[] args) throws Exception {

        String fileName = "test.log";
        SocketChannel socketChannel = SocketChannel.open(new java.net.InetSocketAddress("localhost", 8888));

        Charset charset = Charset.forName("UTF-8");
        ByteBuffer buffer1 = ByteBuffer.allocate(1024);
        buffer1.put(fileName.getBytes(charset));
        buffer1.flip();
        socketChannel.write(buffer1);

        String filePath = "C:\\tmp\\filedownload\\temp.log";
        FileChannel outChannel = new FileOutputStream(filePath).getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        long fileSize = socketChannel.read(buffer);
        while (fileSize > 0) {
            buffer.flip();
            outChannel.write(buffer);
            buffer.clear();
            fileSize = socketChannel.read(buffer);
        }

        File file = new File(filePath);
        System.out.println(file.getName() + "has been saved at: " + file.getAbsolutePath());
        outChannel.close();
        socketChannel.close();
    }
}

以上就是Java使用NIO优化IO实现文件上传下载功能的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java使用NIO优化IO实现文件上传下载功能 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java的Spring AOP详细讲解

    关于“Java的Spring AOP详细讲解”的攻略,我可以给你讲解一下。首先,我们需要明白什么是AOP,AOP全称是Aspect Oriented Programming,即面向切面编程。它是一种编程思想,可以将程序中相同的横切面代码抽取出来,集中到一起进行管理和处理。Spring AOP是基于AOP思想的实现,可以很好的解决代码耦合问题。 在Spring…

    Java 2023年5月19日
    00
  • 精确查找PHP WEBSHELL木马的方法(1)

    精确查找PHP WEBSHELL木马的方法(1)攻略 查找PHP WEBSHELL木马一直是网络安全工作者的必备技能之一,本文将介绍一些精确查找PHP WEBSHELL木马的 方法,以帮助网络安全工作者更好地发现和处理木马。 1. 根据木马特征字符串查找 检查服务器上各个网站的PHP文件,可以在其文件头或尾巴查找PHP木马中常用的特征字符串来发现有无木马文件…

    Java 2023年6月15日
    00
  • SpringMVC @RequestMapping注解属性详细介绍

    以下是关于“SpringMVC @RequestMapping注解属性详细介绍”的完整攻略,其中包含两个示例。 SpringMVC @RequestMapping注解属性详细介绍 在SpringMVC中,@RequestMapping注解是一个非常重要的注解,它用于将请求映射到对应的控制器方法上。@RequestMapping注解有很多属性,下面我们来详细介…

    Java 2023年5月16日
    00
  • 深入剖析构建JSON字符串的三种方式(推荐)

    深入剖析构建JSON字符串的三种方式(推荐) 在Web开发中,构建JSON字符串是一种常见的需求。通过JSON字符串的构建,我们可以方便地将数据从服务器传递到客户端。 在这里,我为大家介绍三种构建JSON字符串的方式。这些方式覆盖了大部分在Web开发中使用JSON字符串的常见情况。 手动构建JSON字符串 这种方式是最基础的,也最容易理解的方式。我们通过字符…

    Java 2023年5月26日
    00
  • Spark调优多线程并行处理任务实现方式

    Spark是一个非常强大的分布式计算框架,但是针对大规模数据处理任务,在默认情况下可能会遇到性能瓶颈。因此,我们需要通过调优实现多线程并行处理,从而提高处理效率和性能。 下面是“Spark调优多线程并行处理任务实现方式”的完整攻略: 1. 理解Spark任务并行处理原理 在进行Spark任务的并行处理时,我们需要考虑两个重要的参数:执行器数和任务分区数。 执…

    Java 2023年5月19日
    00
  • 【MongoDB for Java】Java操作MongoDB数据库

    MongoDB是开源的、高性能的文档型数据库,而Java作为一种流行的编程语言,有丰富的工具和库支持MongoDB。本文将详细说明Java操作MongoDB数据库的完整攻略,具体过程包括以下几个步骤: 安装MongoDB驱动 Java操作MongoDB需要先安装MongoDB的Java驱动,可以通过Maven等依赖工具导入: <dependency&g…

    Java 2023年6月1日
    00
  • Java加密解密和数字签名完整代码示例

    首先我们需要明确几个概念:加密、解密、数字签名。 加密:将明文(未加密的数据)通过某种方式转换成密文(已加密的数据),使得未授权的第三方无法读取到数据内容。 解密:将密文还原成明文,使得有授权的第三方可以读取数据内容。 数字签名:对数据进行加密后再生成一个签名,用于验证数据的来源和完整性。 下面我们分别讲解 Java 中的加密解密和数字签名的完整代码示例。 …

    Java 2023年5月19日
    00
  • SpringBoot参数校验之@Valid的使用详解

    SpringBoot参数校验之@Valid的使用详解 在Spring Boot中,参数校验是非常重要的一环,在实际开发中,我们经常会遇到需要对用户提交的数据进行校验的场景,比如注册时,我们需要校验用户名、密码、邮箱格式等数据是否符合要求。这时,我们就可以通过使用Spring Boot提供的参数校验功能来实现。 Spring Boot提供了一个非常方便的参数校…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部