Java IO 和 NIO

news2024/9/29 17:38:17

在 Java 编程中,输入输出(IO)是不可或缺的部分,随着技术的发展,Java 的 IO 系统也经历了显著的变化。本文将深入探讨 Java IO 和 NIO 的历史、优缺点以及适用场景。

1. Java IO 的历史

Java IO 包(java.io)自 Java 1.0 以来就存在,最初设计用于简单的数据输入和输出。Java IO 采用阻塞式模型,这意味着当一个线程进行 IO 操作时,线程会被阻塞,直到操作完成。这种设计虽然简单,但在高并发环境下可能导致性能瓶颈。

Java IO 的组成

在这里插入图片描述

Java IO 的主要组成部分分为两大类:

  • 字节流:用于处理原始的二进制数据。

    • 输入流:InputStream
    • 输出流:OutputStream
  • 字符流:用于处理字符数据(文本)。

    • 输入流:Reader
    • 输出流:Writer

示例代码

以下代码示例展示了如何使用 Java IO 进行文件复制操作:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) {
        String sourcePath = "source.txt";
        String destPath = "dest.txt";

        try (FileInputStream fis = new FileInputStream(sourcePath);
             FileOutputStream fos = new FileOutputStream(destPath)) {
            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. Java NIO 的引入

Java NIO(Non-blocking I/O)是在 Java 1.4 中引入的,目的是解决传统 IO 的一些局限性。NIO 支持非阻塞式选择器模型,使得一个线程可以同时管理多个 IO 通道,从而显著提高了处理并发的能力。
在这里插入图片描述

Java NIO 的组成

NIO 的核心组件包括:

  • 缓冲区(Buffer):用于在内存中存储数据。
  • 通道(Channel):与 IO 设备(文件、网络等)的连接,可以进行读写操作。
  • 选择器(Selector):用于管理多个通道的事件,允许单个线程处理多个通道。

示例代码

以下是各个核心组件的示例代码:

1. 缓冲区(Buffer)
import java.nio.ByteBuffer;

public class BufferExample {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        buffer.put((byte) 1);
        buffer.put((byte) 2);
        buffer.flip(); // 切换为读取模式

        while (buffer.hasRemaining()) {
            System.out.println(buffer.get());
        }
    }
}
2. 通道(Channel)
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.StandardOpenOption;
import java.nio.file.Paths;

public class ChannelExample {
    public static void main(String[] args) {
        try (FileChannel channel = FileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ)) {
            System.out.println("文件大小: " + channel.size() + " 字节");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3. 选择器(Selector)
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;

public class SelectorExample {
    public static void main(String[] args) {
        try {
            Selector selector = Selector.open();
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.bind(new InetSocketAddress(8080));
            serverSocketChannel.configureBlocking(false);
            serverSocketChannel.register(selector, serverSocketChannel.validOps());
            System.out.println("服务器已启动,等待连接...");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. IO 和 NIO 的优缺点比较

特性Java IOJava NIO常用开源组件
模型阻塞式非阻塞式Netty(NIO)
并发能力Spring WebFlux(NIO)
API复杂性简单复杂Apache MINA(NIO)
学习曲线平缓陡峭
适用场景小型项目,简单任务高并发,大流量应用

4. 适用场景

  • Java IO

    • 适用于小型项目,或对性能要求不高的场景,例如简单的文件读写操作。
    • 适合一次性任务,比如读取配置文件、简单的数据处理等。
  • Java NIO

    • 适用于高并发、大流量的应用场景,例如网络服务器、大型数据处理、文件传输等。
    • 特别适合需要长时间等待的 IO 操作,或需要同时处理多个任务的场景。

结论

Java 的 IO 和 NIO 各有优缺点,选择合适的技术栈取决于具体的应用需求。在高并发和大数据量的环境下,NIO 更具优势;而在简单文件操作和小型项目中,传统的 IO 方式更为便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2177444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM和GC监控技术

一、监控技术简介 JVM是什么?项目里面有JVM吗?JVM跟Tomcat有什么关系?为什么需要去分析JVM? 1. JVM(全称:Java Virtual Machine),Java虚拟机 是Java程序运行的环境,它是一个虚构的计算机&…

盛世欢歌,共庆华诞!祝大家国庆节快乐!

举国同庆 盛世中华 盛世欢歌,共庆华诞!在这美好的时光里,让我们一起欢庆国庆,感受祖国的强大和美好。数图祝大家国庆快乐! 国庆来临之际,根据国家有关规定,现将2024年国庆放假安排通知如下&…

JVM(HotSpot):虚拟机栈(JVM Stacks)与本地方法栈(Native Method Stacks)

文章目录 一、内存结构图二、数据结构-栈三、JVM栈四、本地方法栈五、问题辨析1、垃圾回收是否涉及栈内存?2、栈内存越大越好吗?3、方法内的局部变量是否线程安全?4、栈内存溢出问题 一、内存结构图 二、数据结构-栈 数据结构中,…

windows 系统服务在注册表中的位置

计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services 此注册表项下是系统服务安装信息 利用此注册表项可以获取服务详细信息

新版Android Studio Koala 导入github第三方依赖 maven仓库的处理方法 (java版)

以下是依赖的处理 这是由于Android Studio 构建项目模式发生改变了。 旧版项目构造 创建新的项目采用build.gradle.kts配置。 先看旧版同样的配置是什么样的。 再来查看新版带.kts后缀文件官方自带的库是怎么配置,模拟配置就OK。 先看libs文件这个库的写法。 …

隐藏SpringBoot自动生成的文件

第一种方法——删除 第二种方法——Settings——Editor——fail types

题库系统平台开发功能解析

题库系统开发功能介绍可以从多个方面进行阐述,以下是一些核心功能及其详细解释 1. 题库管理系统 题目录入与编辑:提供灵活的题目录入方式,支持手动输入、批量导入(如从Excel、Word等文件中导入)以及从其他题库中复制试…

HuggingChat macOS版正式发布!文章内附体验地址!我国打造糖尿病专用AI模型|AI日报

文章推荐 全新豆包AI视频模型发布!实测下的可灵与豆包!原来它们的差距不止一点点... 今日热点 我国团队打造糖尿病专用AI模型 上海交通大学清源研究院MIFA实验室携手复旦大学附属中山医院内分泌科,组建专家团队,联手开发一款名…

Spring Boot项目连接Oracle数据库启动报错:Undefined Error

描述:远程拉下来的代码,配置了maven仓库后,未进行其他修改,自己本地启动报错。 报错现状: 解决:添加参数-Duser.nameuser后,启动成功。 原因分析: 分析一: maven仓…

Altium Designer脚本系统内置函数汇总(2417个)

Altium Designer脚本系统内置函数汇总(2417个) ↑↑↑点击上方蓝字,关注我们! Altium Designer 2013脚本系统内置函数,一共2417个。 这些函数名称复制到Altium Designer 2013脚本编辑器中会自动变为褐红色(#800000),内部函数大部分…

跨境必备:3个必不可少的低预算营销渠道

不管是跨境电商卖家还是外贸从业人员,从个体到企业或品牌,流量都是宣传营销领域的重点。有流量才能让更多的消费者看到自己的产品,从而有机会了解产品并促成转化。 各大跨境电商平台、社交媒体平台和搜索引擎等平台都提供了付费营销功能&…

16.网络编程(下篇)

目录 1.网络编程概述 2.应用软件架构 3.网络编程三要素-IP地址 4.网络编程三要素-端口与协议 5.UDP通信程序 6.TCP通信程序 1.网络编程概述 1.1计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系…

【问题解决】win10日志错误:创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013

背景 最近win10死机了一次,查看事件管理器发现有大量的报错:“创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013”,如图: 解决 win键搜索internet选项 确定。 原因 参考错误:“ 创建 TLS 客户端凭据…

C++基础知识9 模版进阶

模版进阶 1. 非类型模板参数2. 模板的特化2.1 概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化2.3.3 类模板特化应用示例 3 模板分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4. 模板总结 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能,还支持多种主流标准协议,如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

C#获取变量的数据类型_C#获取对象的数据类型

C#中的数据类型用 Type 类描述,具体的类型是 Type的对象 一、object.GetType() 对象.GetType()-----对象不能为null,否则运行报错; 通用的获取类型方式 底层对象获取类型,所有的对象,变量获取类型,GetType(); 返回的…

JAVA打造全球商品集散地国际版多商户商城系统小程序源码

打造全球商品集散地 —— 国际版多商户商城系统 🌍【开篇:连接世界,触手可及】🌍 在这个全球化的时代,购物不再受地域限制,每一个消费者都渴望能轻松买到来自世界各地的优质商品。而“打造全球商品集散地”…

快速实现AI搜索!Fivetran 支持 Milvus 作为数据迁移目标

Fivetran 现已支持 Milvus 向量数据库作为数据迁移的目标,能够有效简化 RAG 应用和 AI 搜索中数据源接入的流程。 数据是 AI 应用的支柱,无缝连接数据是充分释放数据潜力的关键。非结构化数据对于企业搜索和检索增强生成(RAG)聊天…

深度学习500问——Chapter17:模型压缩及移动端部署(1)

文章目录 17.1 模型压缩理解 17.2 为什么需要模型压缩和加速 17.3 模型压缩的必要性及可行性 17.4 目前有哪些深度学习模型压缩方法 17.4.1 前段压缩和后端压缩对比 17.4.2 网络剪枝 17.4.3 典型剪枝方法对比 17.4.4. 网络蒸馏 17.4.5 前端压缩 17.4.6 后端压缩 深度神经网络在…

刚毕业就做项目经理,现在感觉越做越没动力,还有必要坚持下去吗?

那种一毕业就做项目经理的,以为是少走10年弯路,干了一年后,才发现这简直就是在坑自己。没点真材实料,经理也变成了“空中架子”。 因此,很多一毕业就当上项目经理的人,要么是干着干着就转回到技术岗位&…