JAVA IO之基础知识

ops/2024/9/23 10:39:33/

简介

IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

字节流和字符流

Java I/O 提供了字节流和字符流两种方式来处理 I/O 操作:

字节流

处理原始的字节数据,适用于所有类型的数据(包括文本和二进制数据)。

输入字节流InputStream 类

InputStream 类及其子类(如 FileInputStream、BufferedInputStream)

输出字节流OutputStream 类

OutputStream 类及其子类(如 FileOutputStream、BufferedOutputStream)

字符流

Reader用于从源头(通常是文件)读取数据(字符信息)到内存中,java.io.Reader抽象类是所有字符输入流的父类。

输入字符流Reader 类

Reader 类及其子类(如 FileReader、BufferedReader)

输出字符流 Writer 类

Writer 类及其子类(如 FileWriter、BufferedWriter)

字节缓冲流

BufferedInputStream(字节缓冲输入流)

BufferedInputStream 从源头(通常是文件)读取数据(字节信息)到内存的过程中不会一个字节一个字节的读取,而是会先将读取到的字节存放在缓存区,并从内部缓冲区中单独读取字节。这样大幅减少了 IO 次数,提高了读取效率。

BufferedOutputStream(字节缓冲输出流)

BufferedOutputStream 将数据(字节信息)写入到目的地(通常是文件)的过程中不会一个字节一个字节的写入,而是会先将要写入的字节存放在缓存区,并从内部缓冲区中单独写入字节。这样大幅减少了 IO 次数,提高了读取效率

字符缓冲流

BufferedReader (字符缓冲输入流)
BufferedWriter(字符缓冲输出流)

异常处理

  • IOException: 所有 I/O 操作中的异常类的超类,用于处理 I/O 操作中的错误。
  • FileNotFoundException: 当尝试访问不存在的文件时抛出。
  • EOFException: 当文件结束标志遇到时抛出。

问题

  1. 不管是文件读写还是网络发送接收,信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字节流操作和字符流操作呢?

尽管信息的最小存储单元都是字节,但字节流和字符流的分离是为了提供适合不同数据类型的处理方式。字节流处理原始字节数据,适合二进制数据;字符流处理字符数据,支持字符编码转换,适合文本数据。通过这种分类,Java I/O 可以更好地满足各种数据处理需求,提高程序的效率和可读性。

总结

Java I/O 是 Java 应用程序处理数据输入和输出的关键机制。掌握字节流和字符流的基本操作,理解文件操作、数据流处理、I/O 性能优化技巧以及 NIO(New I/O)技术,能够帮助开发者更高效地进行文件和数据处理,并提升应用程序的性能和响应速度。


http://www.ppmy.cn/ops/97634.html

相关文章

雅菲奥朗 FinOps 认证培训:开启企业云财务管理转型之路

前言: 在当今快速变化的商业环境中,企业面临着前所未有的IT财务挑战。随着云计算和数字化转型的推进,传统的财务管理方式已经不能满足“企业上云”的需求。FinOps,即“云财务管理”应运而生,成为帮助企业实现IT财务流…

Kafka 性能为什么比 RocketMQ 好

Kafka 性能更好的原因 因为 kafka 零拷贝技术跟 RocketMQ 的不一样。 kafka 零拷贝技术使用的是 sendfileDMA scatter/gather 。只需要经过 2 次拷贝,2 次上下文切换RocketMQ 零拷贝使用的 mmap 内存映射,需要经过 3 次拷贝,4 次上下文切换…

Table API SQL之时区Time Zone详解

目录 数据类型 日期和时间(Date and Time) 日期(DATE) 时间(TIME) 时间戳(TIMESTAMP) 无时区时间戳 有时区时间戳 本地时区时间戳(TIMESTAMP_LTZ) 区间年月(INTERVAL YEAR TO MONTH) 区间日秒(INTERVAL DAY TO SECOND) 时区(Time Zone) TIMESTAMP类…

windows docker 执行apt-get 权限问题

今天在windows下安装的docker 部署的容器执行apt-get遇到权限问题 PS C:\Users\xiaok> docker exec -it jenkins sh $ apt-get update Reading package lists... Done E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) E: Unable to l…

GPT-4o微调功能现已上线

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Button窗口部件

# 2. Button窗口部件 # 简单说明: # Button(按钮)部件是一个标准的Tkinter窗口部件,用来实现各种按钮。按钮能够包含文本或图象, # 并且你能够将按钮与一个Python函数或方法相关联。当这个按钮被按下时,Tki…

【Docker】gitea的ssh容器直通

本文首发于 ❄️慕雪的寒舍 1.跟着文档走 gitea的安装比较简单,直接使用官方文档中的docker-compose文件即可。如果想实现ssh容器直通,需要对这个docker-compose文件做一定修改。 如果你还没有安装docker,参考本站教程 linux安装docker&…

水库大坝安全监测:筑起水坝安全防线

水库大坝安全监测集成了多种传感器、数据采集、传输和处理技术等技术手段,通过在坝体、库区等关键位置设立传感器,来实现水库大坝实时监测的水平位移、垂直位移,这样能够及时发现潜在的安全隐患和异常情况,以便于大坝管理人员能够…