JAVA IO详解

news2025/1/11 17:00:20

目录

一、流的概念与作用

二、Java IO的用途和特征

三、流的使用详解


 

一、流的概念与作用

流(Stream): 在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据传输过程。人们根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。你既可以从流中读取数据,也可以往流中写数据。流的特性与数据源或者数据流向的媒介相关联。

作用:为数据源和目的地建立一个输送通道

在Java IO中按照数据单位将流分为两类:

1.字节流:以字节为单位进行读写 1字节(byte) = 8位(bit)。

2.字符流:以字符为单位进行读写 1字符 = 2字节

字节流字符流的区别:

  1. 字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse() 方法时,信息已经输出了,而字符流只有在调用close() 方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush() 方法。
  2. 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
  3. 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

I/O(输入输出的定义):输入(InputStream) 和 输出(OutputStream) 经常容易让人混淆,因为,一个程序的输入,往往是一个程序的输出。

在这里插入图片描述

 所以我们说的输入与输出都是相对于当前应用程序而言的

二、Java IO的用途和特征

结合上文,我们可以按照流的操作单元和流方向大体上可将流分为四个基本的流类,所有的流都继承这四个:

字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

java.io包除了这四个基本的抽象流类,除此外java.io包类还提供了大量的子类,每个子类都有其特定的功能与用处,大致分为以下用处:

  • File Access ( 文件访问 )
  • Network Access ( 网络访问 )
  • Internal Memory Buffer Access ( 内存缓存访问 )
  • Inter-Thread Communication (Pipes) ( 线程内部通信(管道) )
  • Buffering ( 缓冲 )
  • Filtering ( 过滤 )
  • Parsing ( 解析 )
  • Reading and Writing Text (Readers / Writers) ( 读写文本 )
  • Reading and Writing Primitive Data (long, int etc.) ( 读写基本类型数据 例如long, int )
  • Reading and Writing Objects ( 读写对象 )

java.io之所以提供了那么多子类,是因为java基于装饰模式的设计思想来设计io体系的,它为每个子类提供了很极小颗粒度功能的实现,这样当你需要使用流的某一特定功能时,能动态的装配这些Stream类,获取自己想要的流类。

装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活,是一个对象结构型模式。——刘伟主编的《设计模式(第2版)》

Byte Based InputByte Based OutputCharacter Based InputCharacter Based Output
Basic(基本)InputStreamOutputStreamReader
InputStreamReader
Writer
OutputStreamWriter
Arrays(数组)ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
Files(文件)FileInputStream
RandomAccessFile
FileOutputStream
RandomAccessFile
FileReaderFileWriter
Pipes(管道)PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
Buffering(缓冲器)BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
Filtering(过滤器)FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
Parsing(解析)PushbackInputStream StreamTokenizerPushbackReader
LineNumberReader
Strings(字符串)StringReaderStringWriter
Data(日期)DataInputStreamDataOutputStream
Data - Formatted(格式化日期)PrintStreamPrintWriter
Objects(对象)ObjectInputStreamObjectOutputStream
Utilities(工具)SequenceInputStream

三、流的使用详解

在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。
主要的类如下:
1. File(文件特征与管理):File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
4. Reader(文件格式操作):抽象类,基于字符的输入操作。
5. Writer(文件格式操作):抽象类,基于字符的输出操作。 

举例说明:InputStream

在这里插入图片描述 

1.ByteArrayInputStream:字节数组输入流,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去,我们拿也是从这个字节数组中拿
2.PipedInputStream:管道字节输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信
3.FilterInputStream :装饰者模式中处于装饰者,具体的装饰者都要继承它,所以在该类的子类下都是用来装饰别的流的,也就是处理类。具体装饰者模式在下面会讲解到,到时就明白了
4.BufferedInputStream:缓冲流,对处理流进行装饰,增强,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送。效率更高
5. DataInputStream:数据输入流,它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”
6.FileInputSream:文件输入流。它通常用于对文件进行读取操作
7.File:对指定目录的文件进行操作,具体可以查看讲解File的博文。注意,该类虽然是在IO包下,但是并不继承自四大基础类。
8.ObjectInputStream:对象输入流,用来提供对“基本数据或对象”的持久存储。通俗点讲,也就是能直接传输对象(反序列化中使用) 

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

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

相关文章

【服务器数据恢复】服务器raid5崩溃导致上层应用不可用的数据恢复案例

服务器数据故障: 某公司服务器8块硬盘组成raid5磁盘阵列,其中有2块硬盘故障指示灯报警,其他硬盘指示灯正常,上层应用不可用。 服务器数据恢复过程: 1、服务器数据恢复工程师拿到故障服务器所有硬盘后对出现物理故障的…

ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件实现原理 ADSP-EDU-BF533 开发板上的中断资源连接到了 CPLD,并通过 CPLD 将中断信号连接到 PF0 触发,通过 CPLD映射的…

ubuntu交叉编译(armv7_32位)onnx源码_cpu版本

1 下载onnx git clone https://github.com/microsoft/onnxruntime cd onnxruntime git submodule update --init --recursive2 编译 由于是交叉编译,所以需要设置一下编译工具,在网上搜索看到了这个 chineseocr_lite/build-onnxruntime-android.sh a…

Jmeter(一):jmeter概述与工作原理,安装与基本配置介绍

Jmeter(1):jmeter概述与工作原理 jmeter概述与工作原理 JMeter 是 Apache 基金会 Jakarta 上的一个纯 Java 开源项目,起初用于基 于 Web 的压力测试(pressure test),后来其应用范围逐渐扩展到对文件传输 FTP, 大型数据…

基于JavaWeb+JSP的校园二手交易平台(源码+数据库+说明文档)

目录 一、前后端功能模块 1.用户web前端页面功能模块 2.后台信息管理模块 二、开发环境 三、开发技术 四、页面设计 1.登录注册界面 2.网页主页界面 3.商品列表界面 4.商品详情界面 5.支付页面 6.支付成功后页面 7.我的订单页面 ​8.个人已发布与待处理订单界面…

google外链重要性高吗?谷歌外链作用大不大

google外链重要性高吗? 答案是:非常重要,而且要注重建设付费GPB外链。 要相信有价值的外链一般都比较难获取,那种高流量的外链一般要靠自己去outreach, 但是成功率比较低,我们需要用金钱和优质外链资源去交换 做高质…

程序员的浪费,Python一对一还原《点燃我,温暖你》里面比较火的那个爱心代码 | 附源码

前言 包子们,上午好 最近有个剧挺火的 就是那个程序员的剧,叫《点燃我,温暖你》 最近听说很火呀,那作为程序员,Python中的战斗机的小编,能不给大家安排一波! 怎么说呢,用这个表白也…

我凭借这 1000 道 java 真题,顺利拿下京东、饿了么、阿里大厂 offer

今天这篇文章也算是一次面试总结了吧! 毕竟金九银十过去了,总得给大家来点东西交代交代! 所以今天,这篇文章就应运而生了,给大家来点正正经经的干货教学,让大家体验一下干货的魅力! 小编今天这里…

【C语言数据结构(基础篇)】第一站:时间复杂度与空间复杂度

目录 一、什么是时间复杂度和空间复杂度 1.算法效率 2.时间复杂度的概念 3.空间复杂度的概念 二、如何计算常见的时间复杂度 1.大O的渐进表示法 2.一些时间复杂度的例子 (1)例1 (2)例2 (3)例3 (4)例4 (5&a…

【计算机视觉+自动驾驶】二、多任务深度学习网络并联式、级联式构建详细讲解(图像解释 超详细必看)

觉得有帮助麻烦点赞关注收藏~~~ 一、多任务网络的主要分类 目前建立的多任务网络可以分为两种方法,一种为并联多任务网络结构,另一种为级联多任务网络结构,两种网络构建方式分别如下图所示 并联式 级联式 并联网络结构大多为共享基础网络而…

ADI Blackfin DSP处理器-BF533的开发详解14:LED跑马灯(含源代码)

接口讲完了,下面写点应用程序,GPIO最典型的应用,LED跑马灯。 硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 *硬件实现原理 ADSP-EDU-BF533开发板上共设计了…

2005-2020年全国31省劳动力市场分割指数

2005-2020年全国31省劳动力市场分割指数 1、时间:2005-2020年 2、范围:包括全国31省, 3、数据内容:数据存在缺失,下载链接界面有数据预览,具体缺失情况参看链接内数据预览, 内含原始数据、A…

把废旧监控改无人机遥控车红外远程摄像头

像我们这些精打细算的业余玩家,淘个新宝贝都要掂量掂量。很羡慕能买到专用红外摄像头配无人机。可是手头不宽裕,只有一些旧零件。这都是废物再利用,所以说不要太追求性能了,自然让他工作就好,测试这条路线的可行性。 …

blneder 蜡笔

文章目录简介.打开蜡笔.基本操作.自由线.图形工具.图层.遮罩.画布.画布原点.![在这里插入图片描述](https://img-blog.csdnimg.cn/46cb7019e8ff41e6b391e056c616ce32.png)画布旋转.辅助.圆形.径向.平行.栅格.等距.编辑模式.顶部工具栏.选择.曲线编辑.左侧工具栏.快捷键.画笔深度…

值得一看的Linux内核—中断下半部之软中断

软中断 软中断(softirq)是中断处理程序在开启中断的情况下执行的部分,可以被硬中断抢占。 内核定义了一张软中断向量表,每种软中断有一个唯一的编号,对应一个softirq_action实例,softirq_action实例的成员…

b站黑马JavaScript的Node.js案例代码——考试成绩整理案例

目录 目标效果: 重点原理: 1.js中split方法——转换字符串为数组 2.js中forEach方法——遍历数组中每个对象 3.js数组操作中push方法——添加1/多个元素去数组的末尾 4.js数组操作中replace方法——在字符串中用一些字符替换另一些字符 5.js数组操…

ATtiny13与Proteus仿真-8位通用定时器/计数器与PWM仿真

8位通用定时器/计数器与PWM 1、8位通用定时器介绍 ATtiny13的8位通用定时器/计数器有两个独立的输出比较单元,并支持PWM。这意味着,可以通过8位通用定时器/计数器生产PWM信号。关于PWM的介绍,在这里就展开介绍,请参考相关资料。 ATtiny13的8位通用定时器/计数器具有如下…

备战一年,终于斩获腾讯T3,老子一定有美好的未来...

我就是那个从25岁躺平,30岁开始醒悟的“中年秃头大叔”,这人一到了中年,思考问题的方向确实不一样了。以前我不想结婚不想养育后代,天天公司摸鱼,总觉得自己赚钱自己花就挺好,25岁赚一万,30岁还…

[ 数据结构 ] 排序算法--------七大内排,看完还不会写来揍我

0 前言 1.1 排序分类 内部排序和外部排序,前者数据加载到内存,后者数据量大需借助外部文件. 内部排序包含: 插入排序:直接插入排序,希尔排序 选择排序:简单选择排序,堆排序 交换排序:冒泡排序,快速排序 归并排序 基数排序 1.2 复杂度 1)度量一个程序时间有两种方法,事后统…

tp3.2实现websocket

首先从单服务器实现开始 我的系统是centos系统,lnmp搭建的环境,php5.6 1:首先检查环境是否支持 curl -Ss http://www.workerman.net/check.php | php PHP Version > 5.3.3 [OK] Extension pcntl check [OK] Extension posix check [OK] 2.…