Java I/O(输入/输出)——针对实习面试

目录

  • Java I/O(输入/输出)
    • 什么是Java I/O流?
    • 字节流和字符流有什么区别?
    • 什么是缓冲流?为什么要使用缓冲流?
    • Java I/O中的设计模式有哪些?
    • 什么是BIO?
    • 什么是NIO?
    • 什么是AIO?

Java I/O(输入/输出)

在这里插入图片描述

什么是Java I/O流?

Java I/O流是一种抽象,用于处理输入和输出数据。流可以是字节流InputStreamOutputStream)或字符流ReaderWriter)。

字节流用于处理原始二进制数据,例如文件读写、网络通信等。字符流则用于处理文本数据,它们提供了对字符的更高层次的抽象,使得读写文本更加方便。

Java I/O流的主要特点包括:

  1. 抽象:I/O流提供了一种抽象的方式来处理输入和输出,使得程序员不需要关心底层的硬件和操作系统细节。

  2. 可扩展性:Java的I/O流设计为可扩展的,可以通过继承和实现接口来创建自定义的输入/输出流。

  3. 缓冲:为了提高性能,Java提供了缓冲流(如BufferedReaderBufferedWriter),它们可以减少物理读取的次数

  4. 过滤:Java I/O流支持过滤,可以通过装饰器模式添加额外的功能,如数据压缩、加密等。

  5. 字符集支持:Java I/O流支持多种字符集,可以处理不同语言的文本数据。

  6. 异常处理:Java I/O操作可能会抛出IOException异常,需要程序员进行适当的异常处理。

  7. 资源管理:Java 7引入了try-with-resources语句,可以自动管理实现了AutoCloseable接口的资源,确保在语句结束时自动关闭资源。

字节流和字符流有什么区别?

字节流和字符流是Java I/O中处理数据流的两种方式,它们的主要区别如下:

  1. 处理的数据类型不同

    • 字节流:处理的是字节数据,即原始二进制数据。字节流主要用于处理图像、音频、视频等二进制文件,以及网络通信。
    • 字符流:处理的是字符数据,即文本数据。字符流用于处理文本文件,如读取和写入文本内容。
  2. 使用的类不同

    • 字节流:主要使用InputStreamOutputStream作为基类,以及它们的子类,如FileInputStreamFileOutputStreamBufferedInputStreamBufferedOutputStream等。
    • 字符流:主要使用ReaderWriter作为基类,以及它们的子类,如FileReaderFileWriterBufferedReaderBufferedWriter等。
  3. 缓冲区

    • 字节流:通常不使用缓冲区,每次读写一个字节。
    • 字符流:通常使用缓冲区,可以提高读写效率。例如,BufferedReader可以一次读取一行文本,而BufferedWriter可以一次写入一行文本。
  4. 字符编码

    • 字节流不涉及字符编码,因为它们处理的是原始字节。
    • 字符流涉及字符编码,因为它们处理的是字符。在读写字符流时,需要指定字符编码,如UTF-8、GBK等。
  5. 应用场景

    • 字节流:适用于所有类型的文件,特别是二进制文件。
    • 字符流:适用于文本文件,如读取和写入文本内容。
  6. 性能

    • 字节流:在处理大文件或二进制文件时,性能可能不如字符流,因为它们每次处理一个字节。
    • 字符流:由于使用了缓冲区,通常在处理文本文件时性能更好
  7. 读写方式

    • 字节流:通常需要手动处理数据的读写,例如,需要指定每次读取的字节数。
    • 字符流:提供了更高级别的读写方法,如readLine()write(String),使得读写文本更加方便。

在实际编程中,选择字节流还是字符流通常取决于要处理的数据类型和性能需求。
对于文本文件,通常推荐使用字符流;
对于二进制文件,如图片、音频等,则使用字节流

什么是缓冲流?为什么要使用缓冲流?

缓冲流是一种特殊的流,它对其他输入/输出流进行包装,提供数据的缓冲功能。缓冲流分为两种:缓冲字节流(BufferedInputStreamBufferedOutputStream)和缓冲字符流(BufferedReaderBufferedWriter)。

缓冲流的工作原理:

缓冲流内部维护一个缓冲区,这个缓冲区是一块内存区域,用于临时存储从底层流读取的数据或即将写入到底层流的数据。
当缓冲区时,数据会被一次性写入到底层流
当缓冲区时,会从底层流中一次性读取足够的数据填满缓冲区
这种机制减少了物理读取和写入的次数,从而提高了I/O操作的效率。

为什么要使用缓冲流:

  1. 提高性能:由于减少了物理读写操作的次数,缓冲流可以显著提高I/O操作的性能,特别是对于大量的数据读写操作。

  2. 减少系统调用:缓冲流通过减少系统调用来提高性能。系统调用是一个相对昂贵的操作,因为它涉及到用户态和内核态之间的切换。

  3. 简化编程模型:缓冲流提供了一些便捷的方法,如readLine()write(String),这些方法使得读写文本数据更加简单和直观。

  4. 自动资源管理:在Java 7及以上版本中,缓冲流可以与try-with-resources语句一起使用,这样可以自动管理资源的关闭,减少资源泄漏的风险。

  5. 支持多种字符集:对于字符流,缓冲流如BufferedReader可以支持多种字符编码,使得读写不同编码的文本文件更加方便。

  6. 提高读写效率:对于字符流,缓冲流可以一次读取或写入一个字符数组,这比一次读取或写入一个字符更高效。

总之,缓冲流通过减少物理读写操作的次数,提高了I/O操作的效率和性能,同时也简化了编程模型。在实际开发中,推荐使用缓冲流来处理大量的数据读写操作。

Java I/O中的设计模式有哪些?

Java I/O库中使用了多种设计模式,主要包括以下几种:

  1. 装饰器模式(Decorator Pattern)
    Java I/O库广泛使用了装饰器模式来增强类的功能,而不改变其结构。通过装饰器模式,可以在运行时动态地添加功能。例如,BufferedInputStreamBufferedOutputStream等类通过装饰原始流来提供缓冲功能。

  2. 适配器模式(Adapter Pattern)
    适配器模式允许不兼容的接口协同工作。在Java I/O中,适配器模式用于将字节流转换为字符流。例如,InputStreamReaderOutputStreamWriter将字节流转换为字符流。

  3. 工厂模式(Factory Pattern)
    工厂模式用于创建对象,而不需要指定将要创建的对象的具体类。在Java I/O中,工厂模式用于创建不同类型的流对象。例如,InputStreamOutputStream的子类通常通过工厂方法(如FileInputStreamBufferedInputStream等)创建。

  4. 单例模式(Singleton Pattern)
    单例模式确保一个类只有一个实例,并提供一个全局访问点。虽然Java I/O库中没有直接使用单例模式,但在某些情况下,可以确保某些流对象(如System.inSystem.outSystem.err)是单例。

  5. 观察者模式(Observer Pattern)
    观察者模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。在Java I/O中,这种模式可以用于监控流的状态变化,例如,当流关闭时,可以通知相关的对象。

  6. 建造者模式(Builder Pattern)
    建造者模式用于创建一个复杂对象,它允许通过指定复杂对象的类型和内容逐步构造一个复杂对象。虽然Java I/O库中没有直接使用建造者模式,但在创建复杂的流对象时,可以类比使用这种模式。

  7. 策略模式(Strategy Pattern)
    策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。在Java I/O中,策略模式可以用于选择不同的读写策略。

  8. 模板方法模式(Template Method Pattern)
    模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中实现。在Java I/O中,模板方法模式可以用于定义读取或写入数据的基本步骤,而具体的实现则由子类提供。

什么是BIO?

BIO(Blocking I/O,阻塞I/O)是Java I/O模型中的一种,它指的是在进行I/O操作时,如果数据还没有准备好,或者输出缓冲区已满,操作将会阻塞当前线程,直到数据准备好或者缓冲区可用。

在BIO模型中,服务器客户端之间的通信通常是通过套接字(Socket)进行的。当服务器接收到客户端的连接请求后,它会为每个连接创建一个线程来处理这个连接。如果服务器需要处理大量的并发连接,那么就需要为每个连接都创建一个线程,这会导致资源的消耗和管理的复杂性。

BIO的特点是:

  1. 同步阻塞:在读取数据时,线程会被阻塞,直到数据完全读取完毕。同样,在写入数据时,线程会被阻塞,直到数据完全写入。

  2. 简单易懂:BIO模型相对简单,易于理解和实现。

  3. 资源消耗:由于每个连接都需要一个线程,当并发连接数较多时,会占用大量的系统资源,可能导致性能瓶颈。

  4. 扩展性差:在高并发场景下,BIO模型由于线程资源消耗大,扩展性较差,难以支撑大规模的网络服务。

由于BIO的这些限制,Java在NIO(New I/O,非阻塞I/O)模型中引入了非阻塞I/O操作,以解决BIO在高并发场景下的性能问题。NIO通过使用缓冲区(Buffer)、通道(Channel)和选择器(Selector)等概念,允许服务器使用单个线程来处理多个连接,从而提高了系统的并发处理能力。

什么是NIO?

NIO(New Input/Output)是Java的一个用于处理输入和输出的API,它是在Java 1.4版本中引入的,用以替代旧的阻塞I/O模型(BIO)。NIO的设计目标是提供一种更为高效、可伸缩的I/O处理方式,特别是在处理大量连接和高并发场景下。

NIO的核心特性包括:

  1. 缓冲区(Buffer)

    • NIO中的数据操作都是基于缓冲区的。缓冲区本质上是一个数组,可以是字节数组(ByteBuffer)或字符数组(CharBuffer等)。
    • 缓冲区提供了对数据的结构化访问,并跟踪系统的读/写过程。
  2. 通道(Channel)

    • 通道是NIO中的一个关键概念,它代表了一个打开的连接,可以用于读取和写入数据。
    • 与传统的流(Stream)不同,通道是双向的,即可以读取数据,也可以写入数据。
    • 常见的通道有FileChannelDatagramChannelSocketChannelServerSocketChannel等。
  3. 选择器(Selector)

    • 选择器用于监听多个通道的事件(如连接打开、数据到达等)。
    • 单个线程可以管理多个通道,这就是NIO支持高并发的基础。
    • 通过选择器,一个线程可以处理多个网络连接提高了程序的伸缩性和性能
  4. 非阻塞模式

    • NIO的I/O操作默认是非阻塞的。这意味着,如果读取数据尚未准备好,或者写入的数据无法被立即发送,线程可以去做其他事情,而不是被挂起等待。
  5. 文件锁定和内存映射文件

    • NIO还提供了文件锁定机制和内存映射文件的功能,这些在BIO中是不支持的。
  6. 字符集支持

    • NIO提供了对字符集编码和解码的支持,使得字符数据的读写更加方便。

NIO的使用通常比BIO更为复杂,但它提供了更高的性能更好的资源管理,特别是在需要处理大量连接和高并发请求的服务器应用程序中。例如,在构建高性能的网络服务器或客户端时,NIO是一个非常重要的工具。

什么是AIO?

AIO(Asynchronous I/O,异步I/O)是Java 7中引入的一种非阻塞I/O模型,它是NIO的扩展,提供了真正的异步I/O操作。与NIO不同,AIO中的I/O操作不会导致线程阻塞,当I/O操作完成时,系统会自动通知应用程序。

AIO的核心特性包括:

  1. 异步通道(AsynchronousChannel)

    • AIO中的通道(Channel)是异步的,它们支持真正的异步I/O操作。
    • 当进行读写操作时,应用程序可以提交一个I/O请求,然后可以继续执行其他任务,而不需要等待I/O操作完成。
  2. 回调通知

    • AIO使用回调机制来处理I/O操作的结果。当I/O操作完成时,系统会调用预先注册的回调函数来处理结果。
    • 这种方式避免了线程的阻塞,提高了程序的并发性响应性
  3. 事件和回调

    • AIO通过事件和回调机制来处理I/O操作,这使得应用程序可以更加灵活地处理I/O事件
    • 应用程序可以注册多个回调函数,以便在I/O操作完成时执行不同的操作。
  4. 无阻塞操作

    • AIO的I/O操作不会阻塞线程,这使得应用程序可以处理更多的并发连接,而不会导致线程资源的浪费。
  5. 更好的资源利用

    • 由于AIO不会导致线程阻塞,因此可以更有效地利用系统资源,尤其是在高并发和大量连接的场景下。
  6. 支持多种I/O模型

    • AIO支持多种I/O模型,包括阻塞、非阻塞和异步,这使得它可以根据不同的应用场景灵活选择。

AIO的使用通常比NIO更为复杂,但它提供了更高的性能和更好的资源管理,特别是在需要处理大量并发连接和高性能I/O操作的服务器应用程序中。例如,在构建高性能的网络服务器或客户端时,AIO是一个非常重要的工具。

需要注意的是,AIO在某些操作系统上的支持可能不如NIO完善,因此在实际开发中需要根据目标平台的支持情况来选择合适的I/O模型。

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

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

相关文章

AJAX 全面教程:从基础到高级

AJAX 全面教程:从基础到高级 目录 什么是 AJAXAJAX 的工作原理AJAX 的主要对象AJAX 的基本用法AJAX 与 JSONAJAX 的高级用法AJAX 的错误处理AJAX 的性能优化AJAX 的安全性AJAX 的应用场景总结与展望 什么是 AJAX AJAX(Asynchronous JavaScript and XML…

本地保存mysql凭据实现免密登录mysql

本地保存mysql凭据 mysql加密登录文件简介加密保存mysql用户的密码到本地凭据 mysql加密登录文件简介 要在 mysql客户端 上连接 MySQL 而无需在命令提示符上输入用户名和口令,下列三个位置可用于存储用户的mysql 凭证来满足此要求。 配置文件my.cnf或my.ini /etc…

图形几何之美系列:仿射变换矩阵(二)

“ 在几何计算、图形渲染、动画、游戏开发等领域,常需要进行元素的平移、旋转、缩放等操作,一种广泛应用且简便的方法是使用仿射变换进行处理。相关的概念还有欧拉角、四元数等,四元数在图形学中主要用于解决旋转问题,特别是在三维…

Jmeter的安装,设置中文,解决乱码问题

1.Jmeter安装 1-Jmeter如何下载 1---我这里提供一个下载快的方式 https://www.123684.com/s/lWZKVv-4jiav?提取码:4x4y 2---Jmeter官网下载地址 Apache JMeter - Download Apache JMeter 2-配置java环境 1---下载javaJDK 官方下载地址 https://www.oracle.com/java/techno…

【Uniapp】Uniapp Android原生插件开发指北

前言 在uniapp开发中当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,或者是第三方公司提供的是Android的库,这时候可使用App离线SDK开发原生插件来扩展原生能力。 插件类型有两种,Module模…

微信小程序——用户隐私保护指引填写(详细版)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

reg注册表研究与物理Hack

reg注册表研究与物理Hack 声明:内容的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 目录 reg注册表研究与物理HackWindows注册表修改注册表实现应用程序开机…

[论文粗读][REALM: Retrieval-Augmented Language Model Pre-Training

引言 今天带来一篇检索增强语言模型预训练论文笔记——REALM: Retrieval-Augmented Language Model Pre-Training。这篇论文是在RAG论文出现之前发表的。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 语言模型预训练…

深入浅出WebSocket(实践聊天室demo)

文章目录 什么是WebSocket?WebSocket连接过程WebSocket与Http的区别重连机制完整代码使用方法心跳机制实现聊天室demo(基于Socket.io)参考文章、视频小广告~什么是WebSocket? WebSocket 是一种在单个TCP连接上进行全双工通信的协议(计算机网络应用层的协议) 在 WebSocket A…

RabbitMQ队列详细属性(重要)

RabbitMQ队列详细属性 1、队列的属性介绍1.1、Type:队列类型1.2、Name:队列名称1.3、Durability:声明队列是否持久化1.4、Auto delete: 是否自动删除1.5、Exclusive:1.6、Arguments:队列的其他属性&#xf…

springboot029基于springboot的网上购物商城系统

🍅点赞收藏关注 → 添加文档最下方联系方式领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 基于…

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表,但是hbase是一个列式存储的表结构,与我们常用的mysql等关系型数据库的存储方式不同,mysql中的所有列的数据是按照行级别进行存储的,查询数据要整个一行查询出来,不想要的字段也需要…

二手交易平台测试用例设计和执行

🎄欢迎来到边境矢梦的csdn博文🎄 🎄追求开源思想和学无止境思想一直在提升技术的路上 🎄 🌈涉及的领域有:Java、Python、微服务架构和分布式架构思想、基本算法编程🌈 🎆喜欢的朋友可…

SpringBoot框架的简介及实现步骤

一,SpringBoot简介: Spring Boot 是一个由 Pivotal 团队开发的开源框架,它基于 Spring 框架,旨在简化新 Spring 应用的初始搭建以及开发过程。Spring Boot 提供了多种特性来帮助开发者快速地创建独立的、生产级别的基于 Spring 的应用。 在…

七大AI知识库工具概览

在数字化转型的浪潮中,企业越来越注重知识管理的重要性。以下是七款各具特色的AI知识库工具,它们通过智能化手段助力企业在知识管理、团队协作及客户服务等方面取得显著成效。 HelpLook AI知识库 概述:作为一款SaaS软件,HelpLook…

26.校园快递物流管理系统(基于SSM和Vue的Java项目)

目录 1.系统的受众说明 2.相关技术 2.1 JAVA简介 2.2 SSM三大框架 2.3 MyEclipse开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 2.6访问数据库实现方法 3. 系统分析 3.1 需求分析 3.2 系统可行性分析 3.2.1技术可行性:技术背景 3.2.2经济可行性…

数据编排与ETL有什么关系?

数据编排作为近期比较有热度的一个话题,讨论度比较高,同时数据编排的出现也暗示着数字化进程的自动化发展。在谈及数据编排时,通常也会谈到ETL,这两个东西有相似点也有不同点。 数据编排和ETL(提取、转换、加载&#x…

CSS教程(二)- CSS选择器

1. 作用 匹配文档中的某些元素为其应用样式。根据不同需求把不同的标签选出来。 2. 分类 分类 基础选择器 包含 标签选择器、ID选择器、类选择器、通用选择器等 复合选择器 包含 后代选择器、子代选择器、伪类选择器等 1 标签选择器 介绍 又称为元素选择器,根…

材质(二)——材质参数化,从源材质继承生成不同的材质实例

继承原材质,对外提供参数。 更改调制不同的参数,生成不同的材质实例。 类似于,类的继承。有一个基类Base.继承生成为子类 A_Base,B_Base,C_Base

WordPress 2024主题实例镜像

目录 隐藏 1 WordPress 2024主题实例镜像启用的插件 2 WordPress 2024主题实例镜像截图 WordPress 2024主题实例镜像启用的插件 WordPress 2024主题实例镜像启用了2024主题,配置了: Akismet 反垃圾评论插件 Admin Notices Manager仪表盘通知隐藏…