文件IO流最详细的知识点,一点不落下

2023-12-01 12:18

本文主要是介绍文件IO流最详细的知识点,一点不落下,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、File类
    • 1.概述
    • 2.构造方法
    • 3.创建功能
    • 4.判断和获取功能
    • 5.删除功能
  • 二、递归
    • 1.概述
    • 2.解决问题思路
    • 3.递归要解决问题就必须找到两个内容
  • 三、IO流
    • 1.概述
    • 2.分类
  • 四、字节流
    • 1.字节流写数据
      • 字节流抽象基类
      • FileOutputStream:文件输出流用于将数据写入File
      • 使用字节输出流写数据的步骤
      • 字节流写数据的三种方式
      • 字节流写数据的两个小问题
      • 加异常处理
    • 2.字节流读数据
      • FileInputStream:从文件系统中的文件获取输入字节
      • 步骤
      • 一次读一个字节数组数据
    • 3.字节缓冲流
      • BufferedInputStream
      • BufferedOutputStream
  • 五、字符流
    • 1.为什么会出现字符流?
    • 2.编码
    • 3.解码
    • 4.字符流抽象基类
      • Reader
      • Writer
    • 5.字符流写数据的5种方式
    • 6.字符流读数据的2种方式
    • 7.字符缓冲流
      • BufferedWriter
      • BufferedReader
    • 8.复制文件的异常处理
  • 六、特殊操作流
    • 1.标准输入输出流
      • 标准输入流
      • 标准输出流
      • 自己实现键盘录入数据
    • 2.打印流
      • 打印流分类
      • 打印流特点
    • 3.对象序列化流
      • 对象序列化概念
      • 对象序列化流:ObjectOutputStream
      • 对象反序列话流:ObjectInputStream
    • 4.Properties
      • 概述
      • Properties作为集合的特有方法
      • Properties和IO流结合的方法
  • 七、总结

一、File类

1.概述

  • 它是文件和目录路径名的抽象表示
  • 文件和目录是可以通过File封装成对象的
  • 对File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已,它是可以存在的,也可以是不存在的,将来是要通过具体的操作把这个路径的内容转换为具体存在的

2.构造方法

在这里插入图片描述

3.创建功能

在这里插入图片描述

4.判断和获取功能

在这里插入图片描述

5.删除功能

在这里插入图片描述

  • 如果同时删除目录和文件,需要先删除目录里面的内容再删除目录,不然会报错

二、递归

1.概述

  • 以编程的角度来看,递归指的是方法定义中调用方法本身的现象

2.解决问题思路

  • 把一个复杂的问题层层转化为一个与原问题相似的规模比较小的问题来求解
  • 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算

3.递归要解决问题就必须找到两个内容

  • 递归出口:否则会出现内存溢出
  • 与原问题相似的规模比较小的问题

三、IO流

1.概述

  • IO:输入/输出(Input/Output)

  • 流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输

  • IO流是用来处理设备间数据传输问题,如文件复制,文件上传,文件下载等

2.分类

  • 按照数据的流向

    输入流:读数据

    输出流:写数据

  • 按照数据类型

    字节流:字节输入流,字节输出流
    用记事本打开,不能读懂内容,就使用字节流

    字符流:字符输入流,字符输出流
    用记事本打开,能读懂内容,就使用字符流

四、字节流

1.字节流写数据

字节流抽象基类

  • InputStream:这个抽象类是表示字节输入流的所有类的超类

  • OutputStream:这个抽象类是表示字节输出流的所有类的超类

  • 子类名特点

    子类名称都是以其父类名作为子类名的后缀

FileOutputStream:文件输出流用于将数据写入File

  • FileOutputStream(String name): 创建文件输出流以指定的名称写入文件

使用字节输出流写数据的步骤

  • 1、创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)

  • 2、调用字节输出流对象的写数据方法

  • 3、释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)

字节流写数据的三种方式

在这里插入图片描述

字节流写数据的两个小问题

  • 字节流写数据如何实现换行?

    写完数据后,加换行符
    windows:\r\n
    linux:\n
    mac:\r

  • 字节流写数据如何实现追加写入呢?
    public FileOutputStream(String name,boolean append)

    创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头

加异常处理

  • finally:在异常处理时提供finally块来执行所有清除操作。比如说IO流中的释放资源
  • 特点:被finally控制的语句一定会执行,除非JVM退出
    在这里插入图片描述

2.字节流读数据

FileInputStream:从文件系统中的文件获取输入字节

  • FileInputStream(Stringname):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名

步骤

  • 1、创建字节输入流对象
  • 2、调用字节输入流对象的读数据方法
  • 3、释放资源
  • 在这里插入图片描述

一次读一个字节数组数据

  • 步骤
    1、创建字节输入流对象
    2、调用字节输入流对象的读数据方法
    3、释放资源
    在这里插入图片描述

3.字节缓冲流

BufferedInputStream

  • 概念

    创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节

  • 构造方法

    BufferedInputStream(InputStream in)

BufferedOutputStream

  • 概念

    该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

  • 构造方法

    BufferedOutputStream(OutputStream out)

  • 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?

    字节缓冲流仅仅是提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作

五、字符流

1.为什么会出现字符流?

  • 由于字节流操作中文不是特别方便,所以Java就提供字符流

  • 字符流=字节流+编码表

  • 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

2.编码

  • 按照某种规则,将字符存储到计算机中,称为编码。

3.解码

  • 将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码
  • 按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号,否则就会乱码

4.字符流抽象基类

Reader

  • 概念
    字符输入流的抽象类

Writer

  • 概念

    字符输出流的抽象类

5.字符流写数据的5种方式

在这里插入图片描述

  • void flush():刷新流,必须刷新才能写进数据

  • close()自带刷新

  • 当释放资源close()操作后,不能继续写数据

6.字符流读数据的2种方式

在这里插入图片描述

7.字符缓冲流

BufferedWriter

  • 概念

    将文本写入字符输出流。缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途

  • 构造方法

    BufferedWriter(Writer out)

  • 特有功能

    void newLine():写一个行分隔符,行分隔符字符串由系统属性定义

BufferedReader

  • 概念

    从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以默认大小,默认值足够大,可用于大多数用途

  • 构造方法

    BufferedReader(Reader in)

  • 特有方法

    public String readLine():读一行文字,结果包含行的内容的字符串,不包括任何行终止字符,如果流的结果已经到达,则为null

8.复制文件的异常处理

try…catch…finally的做法
在这里插入图片描述

jdk7改进方案
在这里插入图片描述

jdk9改进方案

在这里插入图片描述

六、特殊操作流

1.标准输入输出流

标准输入流

  • public static final InputStream in: 通常该流对应于键盘输入或者由主机环境或用户指定的另一个输入源

标准输出流

  • public static final PrintStream out: 通常该流对应于显示输入或由主机环境或用户指定的另一个输出目标

自己实现键盘录入数据

  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  • 改进: Scanner sc=new Scanner(System.in)

    输出语句的本质:是一个标准的输出流

2.打印流

打印流分类

  • 字节打印流

    PrintStream
    PrintStream(String fileName):使用指定的文件名创建新的打印流
    使用继承父亲的方法写数据,查看的时候会转码,使用自己的特有方法写数据,查看的数据原样输出

  • 字符打印流

    PrintWriter

构造方法
在这里插入图片描述

打印流特点

  • 只负责输出数据,不负责读取数据
  • 有自己的特有方法

3.对象序列化流

对象序列化概念

  • 对象序列化就是将对象保存到磁盘中,或者在网络中传输对象

  • 这种机制就是使用一个字节序列表示一个对象,该字节序列包括:对象的类型,对象的数据和对象中存储的属性等信息

  • 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息

  • 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行序列化

对象序列化流:ObjectOutputStream

  • 将java对象的原始数据类型和图形写入OutputStream,可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来实现对象的持久存储,如果流是网络套接字流,则可以在另一个主机或另一个进程中重构对象

  • 构造方法

    ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream

  • 序列化对象的方法

    void writeObject(Object obj):将指定的对象写入ObjectOutputStream

  • 注意

    一个对象要想被序列化,该对象所属的类必须实现Serializable接口

    Serializable是一个标记接口,实现该接口,不需要重写任何方法

对象反序列话流:ObjectInputStream

  • ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象

  • 构造方法
    ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectInputStream

  • 反序列化对象的方法
    Object readObject():从ObjectInputStream读取一个对象

  • 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会出现问题,抛出InvalidClassException异常

  • 解决办法

    给对象所属的类加一个serialVersionUID
    private static final long serialVersionUID = 42L;

  • 如果一个对象中的某个成员变量的值不想被序列化,给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

4.Properties

概述

  • 是一个Map体系的集合类
  • Properties可以保存到流中或从流中加载

Properties作为集合的特有方法

在这里插入图片描述

Properties和IO流结合的方法

在这里插入图片描述

七、总结

在这里插入图片描述
在这里插入图片描述

这篇关于文件IO流最详细的知识点,一点不落下的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/441118

相关文章

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn