Java NIO和IO的区别

Java NIO和IO是两种处理I/O操作的不同方式,Java NIO提供了一种高效的、基于缓冲区的I/O操作,而传统的Java IO则是基于流式(stream-based)的方式。

以下是Java NIO和IO的几个重要区别:

  1. 缓冲区(Buffer)与流(Stream)的区别

Java IO是面向流的编程,数据从一个地方流动到另一个地方,通常是通过InputStream和OutputStream。使用Java IO时,我们读或写数据都是直接和流交互。

Java NIO则是面向块(block)或缓冲区(buffer)的编程方式。数据读取到一个缓冲区中,然后从缓冲区中进行处理。使用Java NIO时,我们读或写缓冲区中的数据,并且缓冲区处理方式和数据处理方式可以是不同的。

  1. 面向不同的通道(channel)

Java IO的FileInputStream和FileOutputStream等是面向字节流的,Reader和Writer是面向字符流的。使用Java IO时,我们使用不同的流来处理不同类型的数据。

Java NIO的通道(channel)则是面向数据块的。通道可以是读的、写的或者双向的,数据总是通过Buffer对象处理。

  1. 阻塞与非阻塞模式的区别

Java IO是阻塞模式的,也就是在进行输入输出操作时,必须等到操作完成才能继续执行下面的代码。

Java NIO则支持阻塞和非阻塞两种模式。与Java IO不同的是,在使用非阻塞模式时,在进行非阻塞的I/O操作时,如果没有可用的数据,程序可以继续执行下面的代码,而不必等待。

  1. 选择器(selector)

Java NIO中的选择器提供了一种可以监控多个通道的机制。可以通过一个单独的线程进行监控多个通道的数据请求。

综上,Java NIO比Java IO更加灵活和高效,可以更好地处理大量的数据请求。下面是一个基于NIO的简单示例:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class NIOClient {

    public static void main(String[] args) throws IOException, InterruptedException {

        InetSocketAddress hostAddress = new InetSocketAddress("localhost", 8899);
        SocketChannel client = SocketChannel.open(hostAddress);

        String message = "Hello World!";
        byte[] messageBytes = message.getBytes("UTF-8");
        ByteBuffer buffer = ByteBuffer.wrap(messageBytes);
        client.write(buffer);

        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
        int bytesRead = client.read(readBuffer);
        while (bytesRead != -1) {
            readBuffer.flip();
            while (readBuffer.hasRemaining()) {
                System.out.print((char) readBuffer.get());
            }
            readBuffer.clear();
            bytesRead = client.read(readBuffer);
        }

        client.close();
    }
}

上述示例为NIO的客户端,与传统IO的客户端示例区别较大。

同时,下面也给出一个基于传统IO的简单示例:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class IOClient {

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

        Socket socket = new Socket("127.0.0.1", 8888);

        OutputStream outputStream = socket.getOutputStream();
        String message = "Hello World!";
        outputStream.write(message.getBytes("UTF-8"));

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String responseString = bufferedReader.readLine();
        while (responseString != null) {
            System.out.println(responseString);
            responseString = bufferedReader.readLine();
        }

        bufferedReader.close();
        outputStream.close();
        socket.close();
    }
}

两个示例从出发点上都是来请求一个服务端发来的数据,但是却使用了不同的技术方案。通过对比,可以更加直观地了解Java NIO和Java IO的区别。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java NIO和IO的区别 - Python技术站

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

相关文章

  • Java中关于字符串的编码方式

    Java中关于字符串的编码方式,是指将字符串表示成一系列的字节序列的方式。在Java中,常见的字符串编码方式有ASCII编码、Unicode编码和UTF-8编码。 ASCII编码 ASCII编码是最基本的字符编码,它将每个字符表示成一个8位的字节,可以表示128个不同的字符。在Java中,可以使用String类的getBytes()方法将字符串按照ASCII…

    Java 2023年5月20日
    00
  • 深入解析Java多态进阶学习

    深入解析Java多态进阶学习攻略 简介 Java是一门支持多态的编程语言。多态是OOP语言中非常重要的特征之一,也是使OOP能够支持继承的灵魂所在。本篇文章将深入讲解Java多态进阶学习的攻略,帮助读者更好地掌握多态的实现方法和使用技巧。 什么是多态 在Java中,多态是指同一个方法在不同的情况下具有不同的行为。通俗地讲,就是同一个方法可以被不同的对象调用,…

    Java 2023年5月26日
    00
  • Spring Boot 2 实战:自定义启动运行逻辑实例详解

    在Spring Boot应用程序中,可以使用ApplicationRunner和CommandLineRunner接口自定义启动运行逻辑。本文将详细讲解如何使用这两个接口,包括如何定义和使用它们。 ApplicationRunner接口 ApplicationRunner接口是一个函数式接口,用于在Spring Boot应用程序启动后执行一些逻辑。以下是一个…

    Java 2023年5月15日
    00
  • Mybatis中xml的动态sql实现示例

    关于”Mybatis中xml的动态sql实现示例”,以下是完整攻略: 什么是动态SQL 动态SQL是指根据条件动态拼接生成SQL语句的过程。它通常用于动态查询、更新或删除数据库中的数据。 在Mybatis中,我们可以使用XML文件来动态生成SQL语句,以实现更加精确的数据库操作。 Mybatis中动态SQL的实现方式 在Mybatis中,我们可以使用if、c…

    Java 2023年5月20日
    00
  • 详解如何实现SpringBoot的底层注解

    详解如何实现Spring Boot的底层注解 Spring Boot是一个非常流行的Java框架,它提供了许多便利的功能,其中包括底层注解。在本文中,我们将详细讲解如何实现Spring Boot的底层注解,包括如何创建自定义注解、如何使用元注解和如何使用注解处理器。 创建自定义注解 在Java中,我们可以使用@interface关键字来创建自定义注解。以下是…

    Java 2023年5月15日
    00
  • 推荐一款 IntelliJ IDEA 神级插件,由 ChatGPT 团队开发,免费使用,堪称辅助神器!

    来源:https://blog.csdn.net/m0_64880608/article/details/130201349 什么是Bito? Bito是一款在IntelliJ IDEA编辑器中的插件,Bito插件是由ChatGPT团队开发的,它是ChatGPT团队为了提高开发效率而开发的一款工具。 ChatGPT团队是一支专注于自然语言处理技术的团队,他们…

    Java 2023年5月4日
    00
  • 验证注册用户名必须为字母

    验证注册用户名必须为字母需要考虑以下几个方面: 对用户输入的进行验证 在前端和后端分别进行验证 提供用户友好的错误信息 以下是完整攻略: 步骤一:前端验证用户输入 使用JavaScript可以在浏览器端进行用户输入的验证。可以通过正则表达式匹配字符串,判断用户名是否包含除字母以外的其他字符。以下是一个简单的前端示例代码: function isAlphabe…

    Java 2023年6月15日
    00
  • 基于Java数组实现循环队列的两种方法小结

    接下来详细讲解一下“基于Java数组实现循环队列的两种方法小结”的内容。 标题 基于Java数组实现循环队列的两种方法小结 简介 在队列的实现中,循环队列是一种比较常用的方式。本文主要介绍了基于Java数组实现循环队列的两种方法,包括普通循环队列和双端循环队列。 普通循环队列实现 普通循环队列的实现思路是利用数组来存储队列元素,通过两个指针front和rea…

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