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日

相关文章

  • 使用IDEA创建java项目的步骤详解(hello word)

    下面是使用IDEA创建Java项目的步骤详解(hello world)的完整攻略: 1. 下载并安装IDEA 首先,需要从官网下载并安装IntelliJ IDEA,然后启动软件。 2. 创建新项目 选择“Create New Project”按钮,弹出“New Project”窗口。 在“New Project”窗口中,选择“Java”并选择JDK版本,然后…

    Java 2023年5月26日
    00
  • 什么是虚拟化技术?

    以下是关于虚拟化技术的完整使用攻略: 什么是虚拟化技术? 虚拟化技术是一种将物理计算机资源(如处理器、内存、存储器等)抽象为个虚拟计算机的技术。它可以让多个虚拟计算机在同一物理计算机上运行,从而提高计算机资源的利用率和灵活性。 虚拟化技术的分类 虚拟化技术可以分为以下几种: 完全虚拟化:在完全虚拟化中,虚拟机可以运行不同的操作系统,且不需要对操作系统修改。它…

    Java 2023年5月12日
    00
  • JavaSpringBoot报错“HeuristicRollbackException”的原因和处理方法

    原因 “HeuristicRollbackException” 错误通常是以下原因引起的: 事务问题:如果您的事务存在问题,则可能会出现此错误。在这种情况下,需要检查您的事务并确保它们正确。 并发问题:如果您的应用程序存在并发问题,则可能会出现此错误。在这种情况下,您需要检查您的应用程序并确保它们正确。 数据库问题:如果您的数据库存在问题,则可能会出现此错误…

    Java 2023年5月4日
    00
  • Java基础异常处理代码及原理解析

    Java基础异常处理代码及原理解析 什么是异常处理? Java中的异常指的是程序在运行过程中遇到的错误或异常情况,比如说除数为零、数组下标越界、空指针等。为了保证程序的正常运行,我们需要对这些异常情况进行处理,避免程序崩溃或者出现无法预料的结果。 在Java中,异常处理机制分为两种:检查性异常和非检查性异常。检查性异常需要在代码中进行处理,如IOExcept…

    Java 2023年5月30日
    00
  • Java如何使用正则表达式查找指定字符串

    当我们需要在Java程序中查找某个特定的字符串时,可以使用正则表达式进行匹配。下面是Java如何使用正则表达式查找指定字符串的完整攻略,包含以下步骤: 步骤一:导入java.util.regex包 在使用正则表达式之前,我们需要先导入Java的正则表达式包java.util.regex,以便在代码中使用正则表达式匹配规则。 import java.util.…

    Java 2023年5月27日
    00
  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    下面是关于“使用jQuery.form.js/SpringMVC框架实现文件上传功能”的完整攻略,包含两个示例说明。 使用jQuery.form.js/SpringMVC框架实现文件上传功能 在本文中,我们将介绍如何使用jQuery.form.js和SpringMVC框架实现文件上传功能。 步骤1:添加依赖 首先,我们需要在pom.xml中添加SpringM…

    Java 2023年5月17日
    00
  • Java使用IO模拟注册登录

    下面是Java使用IO模拟注册登录的完整攻略: 1. 需求分析 我们需要设计一套用户注册登录系统,需满足以下几个功能: 用户注册:通过键盘输入用户名和密码,将其写入到本地文件中保存。 用户登录:通过键盘输入用户名和密码,在本地文件中验证用户的正确性。 2. 设计思路 我们需要设计两个类:一个用于用户注册,一个用于用户登录。其中,用户注册需要将用户输入的用户名…

    Java 2023年6月15日
    00
  • Java8到Java19的一些变化分析详解

    Java8到Java19变化分析详解 随着Java版本的不断更新,Java8到Java19经历了多次重大变革,本文将针对这些变化进行详细讲解和分析。 Lambda表达式 Java8引入了Lambda表达式,这是Java8最具革命性的改变之一。Lambda表达式可以简化代码并使代码更具可读性。下面是一个示例说明: List<String> list…

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