java中所有字符输入流的父类是,小白也能看懂的详细Java的IO流解析!!!

2024-03-25 19:50

本文主要是介绍java中所有字符输入流的父类是,小白也能看懂的详细Java的IO流解析!!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

fa2e2b54f92f3348f03144f7ed7d3ad3.png

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

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–java.util.Hashtable--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,打印到文件中。

这篇关于java中所有字符输入流的父类是,小白也能看懂的详细Java的IO流解析!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_32001433/article/details/115785702
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/846070

相关文章

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

SpringCloud中的@FeignClient注解使用详解

《SpringCloud中的@FeignClient注解使用详解》在SpringCloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解来标记Feign客户端接口,这篇文章... 在Spring Cloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获