Java IO详解

154463c6c32f42c8ae4bf69d1ab4ab3b.jpg一、流的概念与作用

 

流(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) 经常容易让人混淆,因为,一个程序的输入,往往是一个程序的输出。

 

在这里插入图片描述

 

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

在这里插入图片描述

 

InputStream和Reader与数据源相关联(即输入流),

OutputStream和writer与目标媒介相关联(即输出流)。

 

此外,我们还可以按功能不同分为 节点流、处理流:

节点流:以从或向一个特定的地方(节点)读写数据。如FileInputStream。

处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装。

 

总结,流的划分可以有很多中:

 

1.按照流的操作单元划分

 

字节流:将数据解释为原始的二进制数据读写均为字节,数据不需要编码和解码,效率更高,可移植(与主句编码方式无关)。

 

字符流: 字符流将原始数据解析成一种字符,文本数据存储 依赖文件编码方式,它输入输出需要编码解码。

 

2.按照流的方向(输出输入都是站在程序所在内存的角度划分的)

 

输入流:从别的地方(本地文件,网络上的资源等)获取资源 输入到 我们的程序中。

输出流:从我们的程序中 输出到 别的地方(本地文件), 将一个字符串保存到本地文件中,就需要使用输出流。

3.按角色功能不同划分

 

节点流,以从或向一个特定的地方(节点)读写数据。如FileInputStream。

处理流,是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装。

.

 

三、Java IO的用途和特征

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

 

  字节流 字符流

输入流 InputStream Reader

输出流 OutputStream Writer

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类,获取自己想要的流类。

 

  Byte Based Input Byte Based Output Character Based Input Character Based Output

Basic(基本) InputStream OutputStream Reader

InputStreamReader Writer

OutputStreamWriter

Arrays(数组) ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter

Files(文件) FileInputStream

RandomAccessFile FileOutputStream

RandomAccessFile FileReader FileWriter

Pipes(管道) PipedInputStream PipedOutputStream PipedReader PipedWriter

Buffering(缓冲器) BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter

Filtering(过滤器) FilterInputStream FilterOutputStream FilterReader FilterWriter

Parsing(解析) PushbackInputStream StreamTokenizer PushbackReader

LineNumberReader  

Strings(字符串) StringReader StringWriter

Data(日期) DataInputStream DataOutputStream    

Data - Formatted(格式化日期) PrintStream PrintWriter

Objects(对象) ObjectInputStream ObjectOutputStream    

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(文件格式操作):抽象类,基于字符的输出操作。

6. RandomAccessFile(随机文件操作):一个独立的类,直接继承至Object.它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。

 

1.字节输入流

在这里插入图片描述

 

1.ByteArrayInputStream:字节数组输入流,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去,我们拿也是从这个字节数组中拿

2.PipedInputStream:管道字节输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信

3.FilterInputStream :装饰者模式中处于装饰者,具体的装饰者都要继承它,所以在该类的子类下都是用来装饰别的流的,也就是处理类。具体装饰者模式在下面会讲解到,到时就明白了

4.BufferedInputStream:缓冲流,对处理流进行装饰,增强,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送。效率更高

5. DataInputStream:数据输入流,它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”

6.FileInputSream:文件输入流。它通常用于对文件进行读取操作

7.File:对指定目录的文件进行操作,具体可以查看讲解File的博文。注意,该类虽然是在IO包下,但是并不继承自四大基础类。

8.ObjectInputStream:对象输入流,用来提供对“基本数据或对象”的持久存储。通俗点讲,也就是能直接传输对象(反序列化中使用),

 

2.输出字节流OutputStream

在这里插入图片描述

 

1.OutputStream 是所有的输出字节流的父类,它是一个抽象类。

2.ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,

3.ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流(序列化中使用)。

 

3.字符输入流Reader

在这里插入图片描述

 

1.Reader 是所有的输入字符流的父类,它是一个抽象类。

2.CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。

3.BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。

4.FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。

5.InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32——OLED菜单

文章目录 一.补充二. 二级菜单代码 简介:首先在我的51 I2C里面有OLED详细讲解,本期代码从51OLED基础上移植过来的,可以先看完那篇文章,在看这个,然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

代码随想录day23--回溯的应用2

LeetCode39.组合总和 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates…

RCS系统之:基础算法

设计仓库机器人的控制管理系统涉及到路径规划、任务分配、库存管理、通信系统等方面。以下是一个基本的仓库机器人控制管理系统方案的概述: 路径规划:设计一个路径规划系统,用于确定机器人在仓库内的最佳行驶路径,以最大程度地提…

optee TA文件签名

TA的签名 在optee_os目录下,存放着签名的私钥和签名脚本。 工程目录 optee_os/keys/default_ta.pem 工程目录 optee_os/scripts/sign_encrypt.py 编译TA时会先将TA编译为elf文件。此时执行签名脚本,对elf文件签名并生成.ta文件。 签名使用了RSA2048的 私…

及其详细的Markdown基础-学习笔记(附有使用案例)

Markdown 基础语法 查看更多学习笔记:GitHub:LoveEmiliaForever 标题创建 标题语法格式 在文字前添加一至六个#即可创建标题 标题是有等级的,具体等级根据#个数决定 由于标题等级参与构建整篇文章的架构,编写时应该遵循如下规…

【C++航海王:追寻罗杰的编程之路】string类

目录 1 -> 为什么学习string类? 1.1 -> C语言中的字符串 2 -> 标准库中的string类 2.1 -> string类 2.2 -> string类的常用接口 3 -> string类的模拟实现 3.1 -> 经典的string类问题 3.2 -> 浅拷贝 3.3 -> 深拷贝 3.3.1 ->…

51_蓝桥杯_led流水灯

一 原理图分析 二 三八译码器工作原理 三八译码器:3个输入控制8路互斥的低电平有效输出。 C B A 输出 0 0 0 Y0 0 0 1 Y1 0 1 0 Y2 0 1 1 Y3 1 0 0 Y4 1 0 1 Y5 1 1 0 Y6 1 1 1 Y7 三 锁存器工作原理 锁存器:当使…

【报告解析】OpenAI Sora视频模型官方报告全解析 | 效果,能力以及基本原理

省流版 1 核心数据处理将视频数据整合成一个一个的Patch,方便统一训练数据,利用扩散Transformer架构 2 功能效果除了可以实现基础的文生视频外,实际上还有非常惊艳的视频延展,视频编辑,视频连接等多种功能&#xff0…

FPGA中的模块调用与例化

目录 一、模块调用与实例化 1.1 模块调用 1.2 模块实例化 1.3 Verilog例化语句及其用法 1.3.1 例化语句的基本格式 1.3.2 实例化三种不同的连接方法 二、模块调用实例-全加器与半加器 2.1 半加器模块 2.2 全加器模块 三、参数定义关键词与整数型寄存器 3.1 参数定义关…

第五节笔记:LMDeploy 大模型量化部署实践

大模型部署背景 参数用FP16半精度也就是2字节,7B的模型就大约占14G 2.LMDeploy简介 量化降低显存需求量,提高推理速度 大语言模型推理是典型的访问密集型,因为是decoder only的架构,需要token by token的生成,因…

设计模式Python实现

过年在家瞎折腾,闲着无聊看到设计模式,于是就想着用Python实现一下。 简单工厂 根据传入的参数决定创建出哪一种产品类的实例。 class CashFactory:def createCashAdapter(self, type):if type "满100减20":return CashReturn(100, 20)elif…

安全技能讲座 - 便携式灭火器 (Portable Fire Extinguishers )

【Transcript 】 火灾随时随地都可能发生,而且毫无征兆。如果您在家中或工作中遇到火灾,便携式灭火器可以帮助您保护自己,并有可能将火灾扼杀在摇篮中。本课程将向您介绍便携式灭火器、其工作原理和使用方法。成功完成本课程后,您…

C++--Linux基础使用

文章目录 几个简单命令开机关机重启查看当前目录切换当前目录列出当前目录下的目录和文件列出指定目录下的目录和文件清屏查看/设置时间 目录和文件目录概要目录详细说明相对路径和绝对路径 上古神器vi创建/打开文件vi 的两种模式vi 的常用命令 用户管理组管理用户管理修改用户…

每日一题——LeetCode1455.检查单词是否为句中其他单词的前缀

方法一 js函数slice() 将字符串按空格符分割为单词数组&#xff0c;记searchWord的长度为n&#xff0c;分割每个单词的前n位看是否和searchWord匹配 var isPrefixOfWord function(sentence, searchWord) {let res sentence.split(" ")for(i 0 ; i < res.lengt…

【Java EE初阶十二】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制&#xff0c;都是在保证 tcp 的可靠性&#xff1b; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了)&#xff1b; 滑动窗口,就让可靠传输对性能的影响,更…

Linux:docker在线仓库(docker hub 阿里云)基础操作

把镜像放到公网仓库&#xff0c;这样可以方便大家一起使用&#xff0c;当需要时直接在网上拉取镜像&#xff0c;并且你可以随时管理自己的镜像——删除添加或者修改。 1.docker hub仓库 2.阿里云加速 3.阿里云仓库 由于docker hub是国外的网站&#xff0c;国内的对数据的把控…

2024年十大数字技术趋势与其安全挑战报告

今天分享的是行业报告&#xff1a;《2024年十大数字技术趋势与其安全挑战报告》 &#xff08;内容出品方&#xff1a;CSA GCR&#xff09; 报告共计&#xff1a;86页 来源&#xff1a;《见鹿报告》 序言 随着数字技术的迅猛发展,越来越多的组织和个人在数字化环境中开展业…

【IIS中绑定SSL证书】

下载SSL证书&#xff1a; 打开服务器IIS&#xff1a; 点击导入 在IIS中新增网站&#xff1a;

2024年【天津市安全员B证】考试技巧及天津市安全员B证复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年天津市安全员B证考试技巧为正在备考天津市安全员B证操作证的学员准备的理论考试专题&#xff0c;每个月更新的天津市安全员B证复审模拟考试祝您顺利通过天津市安全员B证考试。 1、【多选题】《建设行政处罚决定…

常见的几种Web安全问题测试简介

Web项目比较常见的安全问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击。它指的是恶意攻击者往Web 页面里插入恶意html代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web 里面的html 代码会被执行&#xff0c;从而达到恶意用户的特殊…