问:你知道IO和NIO有哪些区别不?

一、先表示一下_
Java IO Java NIO
主要特点 面向流(Stream)的I/O操作 面向缓冲区(Buffer)和通道(Channel)的I/O操作,支持非阻塞I/O和选择器(Selector)
常用方法 InputStream、OutputStream、Reader、Writer等 Channel(如FileChannel、SocketChannel)、Buffer(如ByteBuffer)、Selector
阻塞模式 阻塞模式,调用read/write方法时线程会阻塞 非阻塞模式,线程在等待数据期间可以继续执行其他任务
选择器(Selector) 不支持 支持,可以监视多个通道的状态,提高I/O操作的效率
缓冲区(Buffer) 缓冲区使用较少,数据直接通过流进行读写 使用缓冲区进行数据的读写,提高了数据处理的灵活性
适用场景 小文件读写、简单的网络通信等 大文件处理、高并发网络编程、需要高效I/O操作的场景
二、代码示例

Java IO示例(文件读取):

java 复制代码
try (FileInputStream fis = new FileInputStream("file.txt");
     BufferedInputStream bis = new BufferedInputStream(fis);
     InputStreamReader isr = new InputStreamReader(bis, StandardCharsets.UTF_8);
     BufferedReader br = new BufferedReader(isr)) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Java NIO示例(文件读取,使用缓冲区):

java 复制代码
try (FileChannel fileChannel = FileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ);
     ByteBuffer buffer = ByteBuffer.allocate(1024)) {
    while (fileChannel.read(buffer) != -1) {
        buffer.flip(); // 切换为读模式
        while (buffer.hasRemaining()) {
            System.out.print((char) buffer.get());
        }
        buffer.clear(); // 准备下一次读取
    }
} catch (IOException e) {
    e.printStackTrace();
}
三、仔细聊聊
  1. 主要特点:

    • Java IO:基于流的I/O操作,数据直接从流中读取或写入,不支持非阻塞I/O。
    • Java NIO:基于缓冲区和通道的I/O操作,数据先读入缓冲区,再从缓冲区处理,支持非阻塞I/O和选择器机制,适合处理大量数据和高并发场景。
  2. 常用方法:

    • Java IO:使用InputStream、OutputStream、Reader、Writer等类进行数据的读写。
    • Java NIO:使用Channel(如FileChannel、SocketChannel)进行数据的传输,Buffer(如ByteBuffer)作为数据容器,Selector用于监视多个通道的状态。
  3. 阻塞模式:

    • Java IO:在调用read/write方法时,如果数据不可用或缓冲区已满,线程会阻塞,直到操作完成。
    • Java NIO:提供了非阻塞模式,线程在等待数据期间可以继续执行其他任务,提高了程序的并发性能。
  4. 选择器(Selector):

    • Java IO:不支持选择器机制,每个I/O操作都需要一个线程来处理。
    • Java NIO:引入了选择器机制,可以监视多个通道的状态,当某个通道有数据可读或可写时,选择器会通知相应的线程进行处理,大大提高了I/O操作的效率。
  5. 缓冲区(Buffer):

    • Java IO:虽然也使用缓冲区(如BufferedInputStream、BufferedOutputStream),但这些缓冲区主要是为了减少系统调用次数和提高读写效率,并不是NIO中的核心概念。
    • Java NIO:缓冲区是核心概念之一,数据在通道和应用程序之间通过缓冲区进行传输,提供了更灵活的数据处理方式。
  6. 适用场景:

    • Java IO:适用于小文件读写、简单的网络通信等场景。
    • Java NIO:适用于大文件处理、高并发网络编程、需要高效I/O操作的场景。
四、结尾

Java IO:

  • 优点:简单易用,API直观。
  • 缺点:阻塞模式导致性能瓶颈,不适合处理大量并发请求。

Java NIO:

  • 优点:支持非阻塞I/O和选择器机制,提高了程序的并发性能和I/O操作效率;缓冲区机制提供了更灵活的数据处理方式。
  • 缺点:编程模型相对复杂,在某些简单场景下可能不如Java IO直观易用。
相关推荐
驭渊的小故事1 小时前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
哦虎!6 小时前
【JavaEE】网络初识
java
for_ever_love__6 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓7 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡7 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室8 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项8 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼8 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发
摇滚侠8 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记