Java 对象序列化 NIO NIO2详细介绍及解析

Java 对象序列化 NIO NIO2详细介绍及解析

本文将从以下三个方面详细介绍Java中的对象序列化、NIO和NIO2:

  1. Java对象序列化
  2. NIO
  3. NIO2

Java对象序列化

Java对象序列化是指将Java对象转换为字节流,以便在网络上传输或在本地保存到文件中。

Java中的对象序列化可以通过序列化(Serialization)API来实现,包括Serializable接口和Externalizable接口。其中Serializable接口是一个标记接口,用于告诉JVM这个类是可以序列化的,而Externalizable接口则是用于自定义序列化和反序列化过程的接口。

以下是一个示例代码,将Person类对象进行序列化和反序列化,并输出结果:

import java.io.*;

public class ObjectSerializeDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person = new Person("张三", 18);
        String filename = "person.obj";

        // ObjectOutputStream将Person对象序列化到文件中
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(filename));
        outputStream.writeObject(person);
        outputStream.close();

        // ObjectInputStream从文件中反序列化Person对象
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(filename));
        Person deserializedPerson = (Person) inputStream.readObject();
        inputStream.close();

        // 打印反序列化后的Person对象
        System.out.println("Name: " + deserializedPerson.getName());
        System.out.println("Age: " + deserializedPerson.getAge());
    }
}

class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

NIO

NIO(New IO)是Java 1.4中引入的新IO包,与传统IO包(或者称为IO流)相比,它有以下优点:

  1. 可以支持非阻塞IO
  2. 使用一个线程来处理多个连接,降低了线程的开销
  3. 使用Selector来注册连接,降低了连接的开销

以下是一个简单的NIO示例,通过ServerSocketChannel和SocketChannel来实现简单服务器和客户端通信:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NIOServerDemo {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        InetSocketAddress address = new InetSocketAddress("localhost", 9999);
        serverSocketChannel.bind(address);
        serverSocketChannel.configureBlocking(false);

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            int num = selector.select();

            if (num == 0) {
                continue;
            }

            Set<SelectionKey> keys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = keys.iterator();

            while (iterator.hasNext()) {
                SelectionKey key = iterator.next();

                if (key.isAcceptable()) {
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    socketChannel.read(buffer);

                    String message = new String(buffer.array()).trim();
                    System.out.println("Server receives message: " + message);

                    ByteBuffer response = ByteBuffer.wrap(("Server sends response: " + message).getBytes());
                    socketChannel.write(response);
                }

                iterator.remove();
            }
        }
    }
}

NIO2

NIO2是Java 1.7中引入的新IO包,相比于NIO,它有一些新的特性:

  1. 异步IO,可以通过CompletionHandler回调函数处理IO操作的结果
  2. Path类,可以更方便地操作文件系统
  3. 对于非文件系统的IO,提供了AsynchronousChannel接口来支持异步操作

以下是一个简单的NIO2示例,通过AsynchronousServerSocketChannel和AsynchronousSocketChannel来实现简单的服务器和客户端通信:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class NIO2ServerDemo {
    public static void main(String[] args) throws IOException {
        AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open();
        InetSocketAddress address = new InetSocketAddress("localhost", 9999);
        serverChannel.bind(address);

        serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
            @Override
            public void completed(AsynchronousSocketChannel clientChannel, Object attachment) {
                serverChannel.accept(null, this);

                ByteBuffer buffer = ByteBuffer.allocate(1024);
                clientChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
                    @Override
                    public void completed(Integer result, ByteBuffer buffer) {
                        buffer.flip();

                        String message = new String(buffer.array()).trim();
                        System.out.println("Server receives message: " + message);

                        ByteBuffer response = ByteBuffer.wrap(("Server sends response: " + message).getBytes());
                        clientChannel.write(response);

                        buffer.clear();
                    }

                    @Override
                    public void failed(Throwable exc, ByteBuffer buffer) {}

                });
            }

            @Override
            public void failed(Throwable exc, Object attachment) {}
        });

        while (true){}
    }
}

以上是Java对象序列化、NIO和NIO2的简单介绍及示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 对象序列化 NIO NIO2详细介绍及解析 - Python技术站

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

相关文章

  • 详解java实现HTTP请求的三种方式

    详解Java实现HTTP请求的三种方式 HTTP请求是平时开发过程中经常用到的技术,Java语言也提供了多种方式实现HTTP请求。本文主要介绍Java实现HTTP请求的三个方式:URLConnection、HttpClient、OkHttp,分别详细说明其使用方法和注意事项。 使用URLConnection实现HTTP请求 发送GET请求 发送GET请求的代…

    Java 2023年5月18日
    00
  • SpringBoot Bean花式注解方法示例上篇

    说明 Spring Boot是快速开发并且便于配置的微服务框架。Bean是Spring IoC容器中管理对象的基本单位。在Spring Boot中,可以使用多种方式注入Bean,如使用XML配置、注解等方式。本篇文章将介绍Spring Boot中Bean注解的多种使用方式。 一、@Component系列 @Component是Spring Boot中最简单的…

    Java 2023年5月20日
    00
  • Java 定时任务技术趋势详情

    Java 定时任务技术趋势详情 什么是 Java 定时任务技术 Java 定时任务技术是一种可以在预定的时间执行任务的技术,它通常用于在特定的时间或周期性地执行某些操作。在 Java 中,定时任务由 Java 自带的 java.util.Timer 类、java.util.concurrent.ScheduledExecutorService 类、Sprin…

    Java 2023年5月20日
    00
  • Spring Boot 利用注解方式整合 MyBatis

    下面是整合MyBatis的完整攻略: 1. 创建Spring Boot项目 首先,需要创建一个Spring Boot项目。我们可以通过Spring Initializr来创建一个基本的项目框架,包含MyBatis的依赖: 打开Spring Initializr, 选择“Maven Project”,选择“Spring Boot”版本和相关选项,点击下一步; …

    Java 2023年5月20日
    00
  • Struts2学习笔记(4)-通配符的使用

    下面是对于“Struts2学习笔记(4)-通配符的使用”的完整攻略: Struts2学习笔记(4)-通配符的使用 在 Struts2中,我们可以使用通配符来匹配 URL 中的任意部分,这使得我们可以更加灵活地配置我们的 URL 地址。 下面将会分别介绍两种常见的通配符。 通配符 * * 通配符允许匹配任何字符,它通常用于模糊匹配路径名称的一部分。 下面是一个…

    Java 2023年5月20日
    00
  • JavaEE实现前后台交互的文件上传与下载

    下面我将详细讲解“JavaEE实现前后台交互的文件上传与下载”的完整攻略。 1. 前言 在Web开发中,文件上传和下载是比较常见的需求,在JavaEE中实现文件上传和下载的过程也不复杂,只需要使用一些相关的API和技术即可完成。本文将分享实现JavaEE中文件上传和下载的详细过程及相关示例,帮助读者了解JavaEE中的文件操作。 2. 文件上传 2.1 文件…

    Java 2023年5月19日
    00
  • 用简单的代码来实现文件上传

    让我来详细讲解一下“用简单的代码来实现文件上传”的完整攻略。 什么是文件上传? 在网站开发中,文件上传就是指用户将本地的文件通过网站上传到服务器中。 实现文件上传的原理 实现文件上传,需要配合HTTP协议,主要分为以下几步: 用户通过网页上传文件,前端通过HTML5的FormData对象将文件数据以二进制流的形式传递到后端。 后端接收到上传的文件数据后,将文…

    Java 2023年6月15日
    00
  • java实现日历窗口小程序

    Java实现日历窗口小程序攻略 1. 实现思路 要实现一个日历窗口小程序,可以考虑以下几个步骤: 创建一个Swing界面,显示当前日期以及日历窗口。 在日历窗口中显示当前月份的日历。 提供按钮或其他交互方式,让用户可以切换月份,也可以选择某一天进行其他操作。 2. 示例1:显示当前月份的日历 下面是一个简单的实现示例,可以通过一个二维数组表示一个月份的日历:…

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