Java NIO和IO的区别

yizhihongxing

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多线程之Semaphore实现信号灯

    现在我来讲解一下”Java多线程之Semaphore实现信号灯”的完整攻略。在Java多线程编程中,Semaphore可以用来控制多个线程需要访问的资源的数量,Semaphore允许多个线程同时访问某一个资源,但需要限制其同时访问的数量。 Semaphore的基本用法 Semaphore的构造方法: public Semaphore(int permits)…

    Java 2023年5月18日
    00
  • 使用Java Minio搭建自己的文件系统详解

    使用 Java Minio 搭建自己的文件系统 本文将为您详细介绍如何使用 Java Minio 搭建自己的文件系统,让您轻松实现对象存储和文件管理。 什么是Java Minio? Java Minio 是 Minio 这个开源对象存储服务的 Java 版本的 SDK。它提供了对于 Minio 这个云存储的 Java 编程式接口,方便 Java 开发者使用和…

    Java 2023年5月20日
    00
  • Java获取http和https协议返回的json数据

    获取HTTP/HTTPS协议返回的JSON数据可以通过Java提供的HttpClient库来实现。以下是完整的攻略: 准备工作 在使用HttpClient库之前,需要先引入该库。可以在Maven项目中添加以下依赖: <dependency> <groupId>org.apache.httpcomponents</groupId&…

    Java 2023年5月27日
    00
  • log4j2的高并发死锁问题配置优化方式

    下面是关于“log4j2的高并发死锁问题配置优化方式”的完整攻略。 问题描述 在高并发场景下,log4j2可能会出现死锁问题。 这是由于log4j2的异步日志功能(Async Appenders)的工作方式导致的。Async Appenders需要将所有的日志事件都放在一个队列中,并在后台的线程中执行写入操作。但是当日志写入速度超过异步日志工作线程的处理速度…

    Java 2023年5月19日
    00
  • java中的4种循环方法示例详情

    Java 中的 4 种循环方法 在 Java 中,我们可以使用 4 种不同的循环方法来循环遍历数据或执行某些操作,分别是:for 循环、while 循环、do…while 循环和增强型 for 循环,下面我们看一下每个循环的用法及示例。 for 循环 for 循环是一种指定循环次数的循环结构,其语法为: for (initialization; termin…

    Java 2023年5月26日
    00
  • 复选框和Struts2后台交互代码详解

    我们来详细讲解“复选框和Struts2后台交互代码详解”的完整攻略。 1. 复选框怎么用? 1.1 HTML中的复选框 在HTML中,复选框是通过input标签来定义的,type属性的值为checkbox。 <input type="checkbox" name="rememberMe" value="…

    Java 2023年5月20日
    00
  • Java Spring的使用注解开发详解

    Java Spring的使用注解开发详解 Java Spring是一个开源框架,它帮助Java开发人员开发企业级应用程序。Spring框架有多种模块,其中最流行的是Spring Core,它是Spring框架的核心部分,提供了依赖注入(DI)和面向切面编程(AOP)等重要功能。本文将详细讲解如何使用注解开发Java Spring应用程序。 环境准备 在开始使…

    Java 2023年5月19日
    00
  • Java中的Lambda表达式是什么?

    下面开始详细讲解Java中的Lambda表达式是什么? Lambda表达式简介 Lambda表达式是Java 8中引入的一种代码简化方式。它可以让我们更容易地编写函数式接口的实例。 Lambda表达式用于简化函数式接口的实现,其本质上是一种可传递的匿名函数:它没有名称,但它有参数列表、函数体和可能抛出的异常列表。 Lambda表达式的语法 Lambda表达式…

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