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

yizhihongxing

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日

相关文章

  • Spring Security单项目权限设计过程解析

    Spring Security 单项目权限设计过程解析 在一个Web应用中,权限管理一般是必不可少的功能。Spring Security 提供了强大的组件和方法,使得我们可以轻松地在应用中添加认证和授权的功能。针对单个应用的权限管理,一般需要经过以下步骤: 步骤一:添加依赖 在项目的 pom.xml 文件中,我们需要添加以下依赖: <dependenc…

    Java 2023年5月20日
    00
  • 基于java中泛型的总结分析

    下面是“基于Java中泛型的总结分析”的完整攻略。 什么是泛型? 泛型是Java 1.5版本中引入的一个新特性,它允许在编译时期实现类型检查和类型参数化。 通俗地说,泛型就是一种参数化的类型,它对不同的数据类型具有通用性。通过使用泛型,编译器可以在编译时期检查类型的匹配情况。 泛型的优缺点 泛型的优点: 增加代码的可读性和安全性,减少代码的重复量; 提供了类…

    Java 2023年5月26日
    00
  • Java语言通过三种方法实现队列的示例代码

    下面是关于“Java语言通过三种方法实现队列”的详细攻略: 一、队列的定义 在计算机科学中,队列是一种特殊的线性数据结构,它只允许在一端进行插入操作,在另一端进行删除操作。在队列中,进行插入操作的一端被称为队尾,进行删除操作的一端被称为队头。 二、常见的队列实现方法 实现队列的方法有很多,其中比较常见的包括: 1、使用数组实现队列 使用数组来实现队列,可以通…

    Java 2023年5月18日
    00
  • 详解Java5、Java6、Java7的新特性

    详解 Java5、Java6、Java7 的新特性 随着 Java 技术的不断发展,每个新版本都带来了新的特性和改进,从 Java5 到 Java7,Java 技术得到了很多重大的改进和新增功能。本文将详细讲解 Java5、Java6、Java7 的新特性。 Java5 Java5 中引入了很多重要的特性,这些特性极大地改进了 Java 语言和虚拟机的性能和…

    Java 2023年5月26日
    00
  • JSP导出Excel文件的方法

    JSP导出Excel文件是一种常见的需求,在这里给出一个JSP导出Excel文件的完整攻略。 1. 准备工作 首先需要引入先关依赖。 jxl.jar (可从网络上下载):jxl是一款专门用于处理Excel文件的java类库,其中包含了读取和写入Excel文件等相关操作。 2. 导出Excel文件的主要过程 (1)定义数据集并填充数据 首先,我们需要定义一个要…

    Java 2023年6月15日
    00
  • 掌握这些GitHub搜索技巧,你的开发效率将翻倍!

    作为开发it行业一员,学习借鉴他人项目是很有必要的,所以我们一般都会从github或者Gitee 上面去参考借鉴他人的项目来学习增加自己的项目经验 但是github你真的用对了嘛,他的功能其实很强大!!! githu项目搜索 关键字搜索 在Github搜索栏中输入与您感兴趣的技术相关的关键词,例如“machine learning”或“web develop…

    Java 2023年5月6日
    00
  • Java数组(Array)最全汇总(中篇)

    Java数组(Array)最全汇总(中篇) 一、概述 本文讲解Java数组的相关知识点,包括定义数组、初始化、数组访问、遍历、数组长度、多维数组等。 二、定义数组 Java数组是一个存储相同类型元素的容器。数组的定义需要指定元素类型和数组大小。 使用以下语法来定义一个数组: dataType[] arrayName; //或者 dataType arrayN…

    Java 2023年5月26日
    00
  • SpringBoot项目如何访问jsp页面的示例代码

    下面是关于Spring Boot项目访问jsp页面的攻略及两条示例说明。 一. 配置pom.xml文件 在Spring Boot项目的pom.xml文件中,添加如下依赖: <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>to…

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