IO流,超详细整理,适合新手入门

标题

  • 1. 文件基础知识
    • 1.1 文件基础知识-文件流
    • 1.2 创建文件的3种方式(不是目录)
    • 3. 获取文件的相关信息
    • 4. 删除文件及创建多级目录
    • 5. mkdir 和 mkdirs 的区别
  • 2. IO流原理及流的分类
    • 2.1 InputStream 字节输入流
    • 2.1.1 FileInputStream
    • 2.1.2 FileOutStream
      • 2.1.3 拷贝文件
    • 2.2 FileReader
    • 2.3 FileWriter
    • 2.4 节点流与处理流
      • 2.4.1 处理流设计模式
      • 2.4.2 BufferedReader
      • 2.4.3 BufferedWriter
      • 2.4.4 Buffered字符流拷贝
    • 2.5 BufferedInputStream
    • 2.6 BufferedOutputStream
    • 2.6.1 Buffered字节流拷贝
    • 2.7 对象流
      • 2.7.1 ObjectOutputStream
      • 2.7.2 ObjectInputStream
      • 2.7.3 对象流使用细节
    • 2.8 标准输入输出流
    • 2.9 转换流
      • 2.9.1 InputStreamReader
      • 2.9.2 OutputStreamWriter
    • 3.0 打印流
      • 3.1 字节打印流
      • 3.2 字符打印流
    • 3.1 Properties类

IO流,超详细整理,适合新手入门_第1张图片

1. 文件基础知识

1.1 文件基础知识-文件流

  1. 文件基础知识-文件流:文件在程序中是以流的形式来操作的
    IO流,超详细整理,适合新手入门_第2张图片
    IO流,超详细整理,适合新手入门_第3张图片

1.2 创建文件的3种方式(不是目录)

  1. 根据路径创建一个File对象
    IO流,超详细整理,适合新手入门_第4张图片
  2. 根据父目录文件+子路径创建
    IO流,超详细整理,适合新手入门_第5张图片
  3. 根据父目录+子路径传创建
    IO流,超详细整理,适合新手入门_第6张图片

3. 获取文件的相关信息

File类图IO流,超详细整理,适合新手入门_第7张图片
IO流,超详细整理,适合新手入门_第8张图片

4. 删除文件及创建多级目录

  1. 1 删除文件IO流,超详细整理,适合新手入门_第9张图片
    4.2 删除目录 : 目录可以当作一个文件
    IO流,超详细整理,适合新手入门_第10张图片
    4.3 创建多级目录用mkdirs
    IO流,超详细整理,适合新手入门_第11张图片

5. mkdir 和 mkdirs 的区别

1、mkdir()

如果父目录不存在,则创建失败。

2、mkdirs()

如果父目录不存在,连同父目录一起创建。(创建文件夹多用此)

mkdir:只能用来创建文件夹,且只能创建一级目录,如果上级不存在,就会创建失败。
mkdirs:只能用来创建文件夹,且能创建多级目录 ,如果上级不存在,就会自动创建。(创建文件夹多用此)

2. IO流原理及流的分类

  • IO流原理
    输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中;
    输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中;

  • 流的分类
    操作数据单位不同分为:字节流(8 bit)对于二进制文件,字符流(按字符) 对应文本文件
    数据流的流向不同分为:输入流、输出流
    流的角色不同分为:节点流、处理流/包装流

(抽象基类) 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

IO流,超详细整理,适合新手入门_第12张图片

2.1 InputStream 字节输入流

InputStream抽象类是所有类字节输入流的超类;

IO流,超详细整理,适合新手入门_第13张图片

2.1.1 FileInputStream

  1. 演示读取文件(单个字节的读取,效率比较低)
    IO流,超详细整理,适合新手入门_第14张图片
    IO流,超详细整理,适合新手入门_第15张图片
  2. 多个字节的读取IO流,超详细整理,适合新手入门_第16张图片

2.1.2 FileOutStream

IO流,超详细整理,适合新手入门_第17张图片

  1. 将数据写入文件中 (写入单个字节),如果文件不存在,则创建文件;
    IO流,超详细整理,适合新手入门_第18张图片
    2.写入字符串(先把字符串转换成字节数组)
    IO流,超详细整理,适合新手入门_第19张图片
    3.1 写入字符串时,可以定义起始位置
    write(byte b[], int off, int len); off是偏移量,len是写入的个数
    在这里插入图片描述
  2. 将数据写入文件时,如果希望写入文件的末尾而不是开头
    IO流,超详细整理,适合新手入门_第20张图片
    IO流,超详细整理,适合新手入门_第21张图片

2.1.3 拷贝文件

IO流,超详细整理,适合新手入门_第22张图片
可以拷贝图片,也可以拷贝音乐;
IO流,超详细整理,适合新手入门_第23张图片

2.2 FileReader

IO流,超详细整理,适合新手入门_第24张图片

单个字符读取
IO流,超详细整理,适合新手入门_第25张图片
多个字符读取
IO流,超详细整理,适合新手入门_第26张图片

2.3 FileWriter

IO流,超详细整理,适合新手入门_第27张图片

细节

  1. 如果不指定true,会默认覆盖文件的内容。
    IO流,超详细整理,适合新手入门_第28张图片
  2. FileWriter使用过后,一定要关闭(close)或者刷新(flush),否则数据流不能写入到文件! 原因:
    源码如下:Force Step Into
    在这里插入图片描述
    在这里插入图片描述
    IO流,超详细整理,适合新手入门_第29张图片
    IO流,超详细整理,适合新手入门_第30张图片
    IO流,超详细整理,适合新手入门_第31张图片
    IO流,超详细整理,适合新手入门_第32张图片
    IO流,超详细整理,适合新手入门_第33张图片
    IO流,超详细整理,适合新手入门_第34张图片
    IO流,超详细整理,适合新手入门_第35张图片

2.4 节点流与处理流

  • 节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter
    在这里插入图片描述
    IO流,超详细整理,适合新手入门_第36张图片
    IO流,超详细整理,适合新手入门_第37张图片
  • 包装流(处理流) 是“连接”在已存在的流(节点流或处理流)之上,如BufferedReader、BufferedWriter;
    IO流,超详细整理,适合新手入门_第38张图片

2.4.1 处理流设计模式

  • 节点流和处理流的区别和联系
  1. 节点流是底层流/低级流,直接跟数据源相接;
  2. 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  3. 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连;【模拟修饰器设计模式】。
  • 处理流的功能主要体现在以下两个方面:
  1. 性能的提高:主要以增加缓冲的方式来提高输入输出的效率;
  2. 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便;
    IO流,超详细整理,适合新手入门_第39张图片
    IO流,超详细整理,适合新手入门_第40张图片
    IO流,超详细整理,适合新手入门_第41张图片
    IO流,超详细整理,适合新手入门_第42张图片
    IO流,超详细整理,适合新手入门_第43张图片

2.4.2 BufferedReader

  1. BufferedReader和BufferWriter属于字符流,是按照字符来读取数据的;
    IO流,超详细整理,适合新手入门_第44张图片
    IO流,超详细整理,适合新手入门_第45张图片
  2. 关闭处理流的时候,只需要关闭外层流即可;源码:
    3.
    in就是我们传入的new FileReader(filePath)i;IO流,超详细整理,适合新手入门_第46张图片

2.4.3 BufferedWriter

  1. BufferedWriter构造器不支持传入一个boolean参数,所以在字节流处添加;
    IO流,超详细整理,适合新手入门_第47张图片
    IO流,超详细整理,适合新手入门_第48张图片

2.4.4 Buffered字符流拷贝

BufferedReader和BufferedWriter只能操作字符,字符流只能读取文本;
不能读取二进制文件【音频,视频,文档,图片】,造成文件损坏;

IO流,超详细整理,适合新手入门_第49张图片

2.5 BufferedInputStream

IO流,超详细整理,适合新手入门_第50张图片

2.6 BufferedOutputStream

IO流,超详细整理,适合新手入门_第51张图片

2.6.1 Buffered字节流拷贝

字节流可以操作二进制文件,但可以操作文本文件吗?可以:不要把汉字的字节拆开就不会乱码!

IO流,超详细整理,适合新手入门_第52张图片

2.7 对象流

IO流,超详细整理,适合新手入门_第53张图片
IO流,超详细整理,适合新手入门_第54张图片

  • 序列化和反序列化
    1. 序列化就是在保存数据的同时,还能保存数据的类型;
    2. 反序列化就是在恢复数据时,恢复数据的值和数据类型;
    3. 需要让某个对象支持序列化机制,就必须让其类是可序列化的;为了让某类是可序列化的,则必须让其类下面两个接口之一:
      • 实现Serializable接口,这是一个标记接口,没有方法;
      • 实现Externalizable接口,这个接口内有方法,需要实现,所以一般不采用;

2.7.1 ObjectOutputStream

使用ObjectOutputSteam序列化基本数据类型和一个Dog对象(age),并保存到data.txt文件中
IO流,超详细整理,适合新手入门_第55张图片
IO流,超详细整理,适合新手入门_第56张图片

2.7.2 ObjectInputStream

使用ObjectInputStream读取data.txt并反序列化恢复文件;
IO流,超详细整理,适合新手入门_第57张图片
IO流,超详细整理,适合新手入门_第58张图片

2.7.3 对象流使用细节

  1. 读写顺序要一致;
  2. 要求序列化或反序列化对象,需要实现Serializable;
  3. 序列化的类中建议添加SerialVersionUID,以提高版本的兼容性;
  4. 序列化对象时,默认将里面所有的属性都进行序列化,除了static和transient修饰的成员;
  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口;
  6. 序列化具备可继承性,也就是如果某一个类实现了序列化,那么它的子类默认实现序列化;
    IO流,超详细整理,适合新手入门_第59张图片

2.8 标准输入输出流

IO流,超详细整理,适合新手入门_第60张图片

2.9 转换流

2.9.1 InputStreamReader

InputStreamReader是Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)
读取文件内容默认是按照utf-8处理,如果把文件编码改成gbk,那么读取文件时就会出现中文乱码,这时需要用到转换流
IO流,超详细整理,适合新手入门_第61张图片
IO流,超详细整理,适合新手入门_第62张图片

2.9.2 OutputStreamWriter

OutputStreamWriter是Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流);
IO流,超详细整理,适合新手入门_第63张图片
在这里插入图片描述
IO流,超详细整理,适合新手入门_第64张图片

当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流

3.0 打印流

打印流只有输出流,没有输入流

3.1 字节打印流

IO流,超详细整理,适合新手入门_第65张图片
IO流,超详细整理,适合新手入门_第66张图片
IO流,超详细整理,适合新手入门_第67张图片

3.2 字符打印流

IO流,超详细整理,适合新手入门_第68张图片
IO流,超详细整理,适合新手入门_第69张图片

3.1 Properties类

  • 配置文件的读取写入☞传统方案
    IO流,超详细整理,适合新手入门_第70张图片
  • 引入Properties

Properties是Hashtable的子类,配置文件的格式:
键=值
键=值
键值对不需要有空格,值不需要用引号括起来,默认是String

load 加载配置文件的键值对到Properties对象
list 将数据显示到指定设备
getProperty(key) 根据建获取值(键、值均是String类型)
get(key) 根据建获取值(返回Object对象)
setPropertiy(key,value) 设置键值对到Properties对象, 没有key相当于添加
store 将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,则会将汉字存储为unicode码

IO流,超详细整理,适合新手入门_第71张图片
get(key)返回Object类型的对象
IO流,超详细整理,适合新手入门_第72张图片
IO流,超详细整理,适合新手入门_第73张图片
IO流,超详细整理,适合新手入门_第74张图片

Properties父类是Hashtable,底层是Hashtable
setProperties()底层源码是Hashtable中的put方法
在这里插入图片描述
IO流,超详细整理,适合新手入门_第75张图片

你可能感兴趣的:(javaSE,java,开发语言)