小白也能看懂的详细Java的IO流解析!!!

2023-11-19

在这里插入图片描述

==================================================================
IO体系特别大,猫叔后续还会继续完善更新的!!!

==================================================================

第一章 IO概述

Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。

输入(input)也叫做读取数据,输出Output也叫做作写出数据。

IO流操作的是文件。可以往文件写数据,也可以读取文件的数据。

IO的分类

根据数据的流向分为:输入流输出流

输入流 :把数据从其他设备上读取到内存中的流。

输出流 :把数据从内存中写出到 其他设备上的流。

​ 通俗理解就是:

​ 以我们写的Java程序为参考:

​ 将文件数据读取到Java中,是输入流;input;

​ Java程序有数据写到文件中,是输出流:output;

根据数据的类型分为:字节流字符流。(计算机中的所有数据都是二进制进行存储 0 1)

字节流 :以字节为单位,读写数据的流。 操作的单位是字节,可以操作所有的数据 。一切皆字节。

字符流 :以字符为单位,读写数据的流。专门操作字符文字。

IO的四个顶级父类

InputStream 这个抽象类是表示字节流输入的所有类的超类。
OutputStream 这个抽象类是表示字节输出流的所有类的超类。
Reader 用于字符输入流的抽象类。
Writer 用于字符输出流的抽象类。

特点:
1.字节流以Stream结尾;
2.这4个顶级父类都是抽象的;

第二章 字节流

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

字节输出流:OutputStream

java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。

抽象类,使用其子类。

1、文件字节输出流:FileOutputStream类

java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。

第一种:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据。(会清空)

第二种:创建对象,参数中都需要传入一个boolean类型的值, true 表示追加数据, false 表示清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了。(实现数据追加续写)

注意

​ 1、使用FileOutputStream类输出的是数字97、98,但是文件显示的是字符;这是因为文本编辑器,自己帮我们转换的;

​ 2、我们如果要换行 \r\n 或者其它操作要注意,操作的是byte类型数据,需要转换;

字节输入流:InputStream

java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。

抽象类,使用其子类。

1、文件字节输入流:FileInputStream类

java.io.FileInputStream 类是文件输入流,从文件中读取字节。

循环读取数据
int read;
while((read = fis.read()) != -1){
    System.out.print((char)read);
}
注意

​ 如果是使用的数组读取,注意要读取的是数组中的有效字节数。String类和byte数组之间转换使用。

第三章 字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

字符输入流:Reader

java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。

抽象类,使用其子类。

1、文件字符输入流:FileReader类

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

Windows系统的中文编码默认是GBK编码表。

字符不是字节,不能之间存储到文件中,文件只能存储字节,中间会有个缓冲区,会先保存到缓冲区中,不会直接进入文件中,使用flush刷新或close关闭的时候,会找到码表转成字节存入到文件中。

(java.io.Reader-java.io.InputStreamReader-java.io.FileReader )

循环读取数据

​ 使用while循环,停止条件是没有数据返回值为-1

注意

​ 如果是使用的数组读取,注意要读取的是数组中的有效字符数。String类和char数组之间转换使用。

字符输出流:Writer

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。

抽象类,使用其子类。

1、文件字符输出流:FileWrite类

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

(java.io.Writer–java.io.OutputStreamWriter–java.io.FileWriter )

注意

​ 未调用flush或close方法,数据只是保存到了缓冲区,并未写出到文件中。

​ 即便是flflush方法写出了数据,操作的最后还是要调用close方法,释放系统资源。

​ 字符流,只能操作文本文件,不能操作图片,视频等非文本文件。

​ 当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流。

字符流的close和flush方法的区别

字节流写数据,不关流,文件中有数据;

字符流写数据,不关流文件中没有数据;

flush:刷新流,数据才会写到文件中;flush后还可以继续操作;

close:关闭流,在关闭前会自动flush一次;close后不能再操作;

第四章 IO异常的try…catch处理

JDK7以前的处理IO流异常:有点麻烦,操作中要考虑变量声明周期;try{ 可能出现异常代码}catchcatch(异常类名 变量名) { 处理异常代码}finally{关流}

JDK7的处理IO流异常:会自动关流;try (创建流的代码) { 可能出现异常代码} catch(异常类名 变量名) { 处理异常代码}

第五章 属性集-Properties类

java.util.Properties 继承于 Hashtable ,来表示一个持久的属性集。

它使用键值结构存储数据,是一个双列集合,每个键及其对应值都是一个字符串。

结合IO流可以方便的将数据写入流中,或从流中读取数据。

(java.util.Map<K,V>–java.util.Hashtable<Object, Object)> --java.util.Properties )

Properties文件(XXX.Properties)

文件保存的后缀使用.Properties

文件#符号表示注释;中文是Unicode编码;

显示注释内容,是输入的时间;

一行是一个键值对,键和值中间是等号=连接;

第六章 缓冲流

缓冲流:能够高效读写,是对基本流对象的一种增强。

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

按照数据类型分类:

字节缓冲流: BufferedInputStream , BufferedOutputStream

字符缓冲流: BufferedReader , BufferedWriter

特点:都是Buffered开头;结尾是父类名;内部自带数组;

创建一个新的缓冲流,真正操作文件依赖参数指定的流;
缓冲流只需要关闭外面的缓冲流,参数传入的流他会自动帮我们关闭

字节缓冲流

字节缓冲输出流:BufferedOutputStream类

字节缓冲输入流:BufferedInputStream类

基本流和缓冲流的效率比较

缓冲流快,建议使用。

字符缓冲流

字符缓冲输出流:BufferedWrite类

特有方法
public void newLine() : 写一个换行符。

字符缓冲输入流:BufferedReader类

特有方法
 public String readLine() : 读一行文字。没有读取到数据返回null;

第七章 转换流

转换流是字节与字符间的桥梁!读取字节,解码为字符;写出字符,编码为字节。

转换输入流:InputStreamReader类

java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。

它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

转换输出流:InputStreamWrite类

java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

第八章 序列化流和反序列化流

序列化流:ObjectOutputStream类

java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。

特有方法
public final void writeObject (Object obj) : 将指定的对象写出。
一个对象要想序列化,必须满足两个条件

1、该类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口(没有任何内容,起到标识作用),不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。

2、该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

反序列化流:ObjectInputStream类

ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

特有方法
public final Object readObject () : 读取一个对象。
注意事项

​ 1、注意从文件中读取对象返回的是Object,取出来做个类型转换。

​ 2、对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一ClassNotFoundException异常。

​ 3、当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个 InvalidClassException 异常。

​ 3.1修改类导致serialVersionUID发生改变–版本号问题;

​ Serializable 接口给需要序列化的类,提供了一个序列版本号。

​ 该版本号的目的在于验证序列化的对象和对应类是否版本匹配,可以给一个固定的版本号。

​ 3.2该类包含未知数据类型、该类没有可访问的无参数构造方法等修改错误;

第九章 打印流

打印流分类:

字节打印流:PrintStream;

字符打印流:PrintWrite;

打印流的特点:都是输出的流;原样输出;

字节打印流:PrintStream类

平时调用 print 方法和 println 方法,这两个方法都来自于java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

(java.io.OutputStream–java.io.FilterOutputStream–java.io.PrintStream )

System.out 就是 PrintStream 类型的,只不过它的流向是系统规定的,打印在控制台上。

Stream;

字符打印流:PrintWrite;

打印流的特点:都是输出的流;原样输出;

字节打印流:PrintStream类

平时调用 print 方法和 println 方法,这两个方法都来自于java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

(java.io.OutputStream–java.io.FilterOutputStream–java.io.PrintStream )

System.out 就是 PrintStream 类型的,只不过它的流向是系统规定的,打印在控制台上。

System.setOut(PrintStream out)-------设置out之后,后面的sout打印的内容就会到PrintStream流里面去;可以修改out,打印到文件中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小白也能看懂的详细Java的IO流解析!!! 的相关文章

  • 如何在测试套件中定义 JUnit 方法规则?

    我有一个类 它是 JUnit 测试类的 JUnit 套件 我想定义一个规则on the suite 这是可以做到的 但需要做一些工作 您还需要定义自己的 Suite 运行程序和测试运行程序 然后在测试运行程序中重写 runChild 使用以
  • 如何查看Pocketsphinx词典中是否存在该单词?

    我只是想看看字典文件中是否存在字符串 字典文件位于问题底部 我想检查语音识别器是否可以识别单词 例如 识别器将无法识别字符串ahdfojakdlfafiop 因为字典中没有定义 所以 我可以检查某个单词是否在 pocktsphinx 词典中
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • tomcat 过滤所有 web 应用程序

    问题 我想对所有网络应用程序进行过滤 我创建了一个过滤器来监视对 apache tomcat 服务器的请求 举例来说 它称为 MyFilter 我在 netbeans 中创建了它 它创建了 2 个独立的目录 webpages contain
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • 源码漏洞思路笔记

    根据文件名称判断内容 部分文件没有固定的名称和位置 取决于编写网站人员 以下是一般情况 admin 后台路径 data 处理数据 install 安装 menber 会员中心 temple 模板文件 bak文件 数据库备份 bak是back
  • SphereEx苗立尧:云原生架构下的Database Mesh研发实践

    嘉宾 苗立尧 2022年7月27日 在由开放原子开源基金会主办的 2022开放原子全球开源峰会 上 SphereEx Mesh实验室负责人 云原生技术专家苗立垚带来了 云原生架构下的Database Mesh的研发实践 的主题演讲 从云原生
  • bean的有效范围和生命周期(scope)

    scope 的取值范围给出了bean的生命周期 存活时间 即scope 取值决定了Tomcat服务器分配给用户的 bean 的有效范围和生命周期 因此需要理解 scope取值的具体意义 下面就JSP动作标记useBean 中scope取值的
  • conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    conda 无法将 conda 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 请检查名称的拼写 如果包括路径 请确保路径正确 然后再试一次 解决办法 没有添加系统变量 所以系统根本识别不了conda命令 找不到位置 添加以下系统
  • java fop,使用ApacheFOP从Java中的XML生成PDF

    I am trying to generate on the fly PDF reports from Java objects I have not been able to find many examples of this so I
  • Hbase的入门心得:

    Hbase的入门心得 在了解了Hadoop的大家族的核心成员HDFS MapReduce以及资源管理器YARN后 HBase又是一个新颖的技术出现 在超人学院吴超老师的视频里介绍到 HBase Hadoop Database是一个分布式的
  • 图智能在反洗钱方向的应用实践丨Fabarta 技术专栏

    导读 依托于 Fabarta 在金融行业应用图技术解决反洗钱业务领域问题成功经验 将图智能在反洗钱方向的应用实践进行总结并分享 主要包括以下几个方面 全文目录 反洗钱业务业务背景 当前反洗钱的业务流程及痛点 如何应用图智能进行反洗钱分析 案
  • Seaborn 入门

    一 Seanborn Seaborn是基于Matplotlib的Python数据可视化库 对matplotlib进行二次封装而成 它提供了一个高级界面 用于绘制引人入胜且内容丰富的统计图形 只是在Matplotlib上进行了更高级的API封
  • IOS高访新浪微博界面(讲解如何自定义UITableViewCell,处理@#链接 特殊字符)

    在开发过程中 有好多应用都会嵌入新浪微博的界面 今天整理一下代码 首先看界面效果图 Demo下载地址 http download csdn net detail rhljiayou 6760745 思路 首先放一个UITableView 自
  • 解决Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPointer

    目录 1 背景 2 问题原因 3 解决办法 方法一 修改配置 方法二 将swagger切换成springdoc 1 背景 升级springboot版本从2 2到2 6 6后 同时使用swagger3 启动后报错 Failed to star
  • RGB颜色表示

    光的色散 牛顿的光的色散实验让人们了解了白光光是由单色光组成的 当白光通过三棱镜就能产生光的色散 分解后白光是由红 橙 黄 绿 蓝 靛 紫等各种色光组成的 而红 绿 蓝则是光的三原色 RGB解释 RGB色彩模式是工业界的一种颜色标准 是通过
  • .NET的第三方软件问题

    很多时候 NET是我的首选平台 它通用 一致 工具齐全 是的 我们对于C 的创新很兴奋 并且时不时会有很好的技术出现 当前的Blazor或者久远的silverlight 但是 如果一个NB的开发者说 net是给在银行工作的人用的 好吧 他们
  • Java equals方法

    对于Object的 equals方法 他比较的是对象是否为同一个对象 如果继承了Object的equals方法没有重写 那么比较的是对象的地址 而String类的equals方法比较的是内容
  • Python人一定要知道的13个代码片段(超有用,拒绝标题党!)

    Python人一定要知道的13个超有用的代码片段 这些日常片段将优化你的Python编程代码 当你每天使用Python来解决挑战 开发算法和构建应用程序时 你会发现自己在不断地重复一些任务 这就是为什么为通常执行的任务准备一些代码片段是一个
  • 华为机试HJ13 句子逆序

    HJ11 数字颠倒 Python 题目 解题思路 代码 结果 题目 解题思路 1 split后倒转 转list 再用空格间隔后输出 列表倒序用reversed 要再转list 代码 split后倒转 转list 再用空格间隔后输出 prin
  • java8 List根据某个字段去重

    1 使用toCollection和TreeSet去重 TreeSet内部使用的是TreeMap 使用指定Comparator比较元素 如果元素相同 则新元素代替旧元素 List
  • 计算机专业毕业答辩问代码吗,计算机专业毕业论文答辩技巧

    在做计算机毕业设计的整个过程中 一般有三个答辩 即开始答辩 中期答辩和最终答辩 有些学校简化为两个 即开题答辩和期末答辩 还有的学校将直接保留了最终答辩 省略了开始答辩和中期答辩 当然不管你要参加几次答辩 亦或者是哪种类型的答辩 最关键的还
  • bp神经网络预测模型实例,bp神经网络模型的建立

    如何建立bp神经网络预测 模型 建立BP神经网络预测模型 可按下列步骤进行 1 提供原始数据2 训练数据预测数据提取及归一化3 BP网络训练4 BP网络预测5 结果分析现用一个实际的例子 来预测2015年和2016年某地区的人口数 已知20
  • flink 第一个窗口开始时间以及offset作用

    简述窗口开始时间 1 当flink程序启动时 创建的第一个window的开始时间是由程序决定的 具体的算法如下 2 窗口开始时间 第一条记录时间戳 第一条记录时间戳 窗口时长 也就是从utc0时区的1970 01 01 00 00 00 0
  • 小白也能看懂的详细Java的IO流解析!!!

    IO体系特别大 猫叔后续还会继续完善更新的 第一章 IO概述 Java中I O操作主要是指使用 java io 包下的内容 进行输入 输出操作 输入 input 也叫做读取数据 输出Output也叫做作写出数据 IO流操作的是文件 可以往文