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异常Exception详细讲解

    Java异常Exception详细讲解 什么是Java异常Exception? 在Java中,异常(Exception)是指程序在运行时遇到的错误或意外情况。当Java程序出现异常时,会抛出一个异常对象,可以通过捕获和处理这个异常来防止程序崩溃。Java中的异常分为三种类型:Checked Exception(受检异常)、Runtime Exception(…

    Java 2023年5月27日
    00
  • java获取当前日期和时间的二种方法分享

    当我们在Java程序中需要获取当前日期和时间时,通常可以使用下面两种常见的方式: 一、使用Java Date类(已过时) Java中的Date类已经被微软官方宣布过时了,不建议使用。不过,这里还是提供一下使用Date类获取当前日期和时间的方式: import java.util.Date; public class GetDateTimeExample { …

    Java 2023年5月20日
    00
  • java基础-数组扩容详解

    Java基础-数组扩容详解 什么是数组扩容 在Java中,数组是一个固定长度的数据结构。当我们在使用数组时,如果需要添加更多的元素,则需要声明一个新的数组并复制所有旧元素到新数组中。这个过程称为“数组扩容”。 在Java中,数组扩容是自动完成的。当我们向一个已经装满元素的数组中添加新元素时,系统会自动创建一个新的数组,并将旧元素复制到新数组中。这个过程对用户…

    Java 2023年5月26日
    00
  • mybatis中的count()按条件查询方式

    Mybatis是一个流行的Java ORM框架,它可以方便的操作数据库。在Mybatis中,我们可以使用count()函数按条件查询数据的总数。本文将详细讨论如何使用mybatis中的count()函数进行条件查询。 Mybatis中的count()函数 在Mybatis中,我们可以通过xml文件或注解方式来编写sql语句。下面给出一个xml文件的示例,其中…

    Java 2023年5月20日
    00
  • Spring Data JPA 实体类中常用注解说明

    下面开始为您讲解 Spring Data JPA 实体类中常用注解的说明,请注意文末有示例代码供参考。 1. @Entity @Entity 注解用于声明当前类是一个实体类(Entity),必须使用此注解标记实体类,也可以自定义表名或指定 catalog 或 schema。 2. @Table @Table 注解可以指定当前实体类要映射到的数据库表名,可以自…

    Java 2023年5月20日
    00
  • 详解MyBatis 常用写法

    让我来给你详细讲解一下“详解MyBatis 常用写法”的完整攻略。 一、 MyBatis 常用写法 1. 增加数据 (1)注解方式 @Insert("insert into user(name, age) values(#{name}, #{age})") int insert(User user); 在此示例中,我们根据User对象的属…

    Java 2023年5月20日
    00
  • Java中的常用输入输出语句的操作代码

    接下来我将为你详细讲解Java中常用的输入输出语句操作代码。 标准输入输出 Java中有两个标准的输入输出流:System.in和System.out。 输出语句 输出语句用于将数据输出到控制台或其他设备。 Java中使用System.out.println()方法来将数据输出,并自动在结尾处添加一个换行符。 例如,以下代码输出“Hello World!”:…

    Java 2023年5月26日
    00
  • JAVA函数的定义、使用方法实例分析

    JAVA函数的定义、使用方法实例分析 函数的定义 在JAVA中,函数也称为方法(Method),是程序中一个可以被重复使用的代码块。它可以接受一些输入(参数)并根据这些输入进行一些操作,然后产生输出。在JAVA中,函数定义的一般格式为: 访问修饰符 返回值类型 方法名(参数列表) { 方法体 return 返回值; } 访问修饰符:指定函数可以被哪些代码访问…

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