输入输出流

输入输出流

InputStream

  • java.io.InputStream:字节输入流。此抽象类是表示字节输入流的所有类的超类。

  • 定义了所有子类共性的方法:

    • abstract int read();从输入流中读取数据的下一个字节。读取到末尾返回-1。
    • int read(byte[] b);从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。返回值为为-1则读到结束标记。
    • int read(byte[] b, int off, int len);将输入流中最多 len 个数据字节读入 byte 数组。
    • void close();关闭此输入流并释放与该流关联的所有系统资源。
  • java.io.FileInputStream extends InputStream:文件字节输入流

  • 作用:把硬盘文件中的数据读取到内存中使用

  • 构造方法:

    • FileInputStream(File file);通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
    • FileInputStream(String name);通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
    • 参数:
      • File file,String name:读取文件的数据源
    • 作用:
      1. 创建一个FileInputStream对象
      2. 会把FileInputStream对象指向要读取的文件

OutputStream

  • java.io.OutputStream:此抽象类是表示输出字节流的所有类的超类。是一个抽象类,不能直接创建对象,需要用到它的子类。

  • 定义了一些子类共性的成员方法:

    • void close();关闭此输出流并释放与此流有关的所有系统资源。
    • void flush();刷新此输出流并强制写出所有缓冲的输出字节。
    • void write(byte[] b);将 b.length 个字节从指定的 byte 数组写入此输出流。
    • void write(byte[] b, int off, int len);将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
    • abstract void write(int b);`将指定的字节写入此输出流。
  • java.io.FileOutputStream extends OutputStream:文件字节输出流

  • 作用:

    • 把内存中的数据写入到硬盘的文件中
  • 构造方法:

    • FileOutputStream(File file);创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
    • FileOutputStream(String name);创建一个向具有指定名称的文件中写入数据的输出文件流。
    • 参数:写入数据的目的地
      • File file:写入数据的文件
      • String name:写入数据的文件的路径
  • 构造方法作用:

    1. 创建一个FileOutputStream对象
    2. 根据构造方法中传递的文件或者文件的路径创建一个空的文件
    3. 会把FileOutputStream对象指向创建好的文件
  • 追加写:

  • 文件的追加写/续写:使用两个参数的构造方法

    • FileOutputStream(File file, boolean append);创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
    • FileOutputStream(String name, boolean append);创建一个向具有指定 name 的文件中写入数据的输出文件流。
    • 参数:
      • File file,String name:写入数据的目的地
      • boolean append:追加写的开关,true为在文件末尾追加写数据,false则创建新文件覆盖原文件
  • 写换行:写换行符号

    1. windows:\r\n
    2. Linux:\n
    3. mac:\r

Reader

  • 使用字符流与字节流的区别:编码表不同,ascll中中文为2字节,UTF-8中为3字节,字节流单个读取中文时,再将其打印可能出现乱码

  • java.io.Reader:字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类。

  • 共性的成员方法:

    • int read();读取单个字符。
    • int read(char[] cbuf);将字符读入数组。
    • abstract void close();关闭该流并释放与之关联的所有资源。
  • java.io.FileReader extends InputStreamReader extends Reader:文件字符输入流

  • 作用:把硬盘文件中的数据以字符的方式读取到文件中

  • 构造方法:

    • FileReader(File file);在给定从中读取数据的 File 的情况下创建一个新 FileReader。
    • FileReader(String fileName);在给定从中读取数据的文件名的情况下创建一个新 FileReader。
    • 参数:
      • File file,String fileName:读取文件的数据源
  • 作用:

    1. 创建一个FileReader对象
    2. 会把FileReader对象指向要读取的文件

Writer

  • java.io.Writer:字符输出流。所有字符输出流的最顶层的父类,是一个抽象类,定义了共性的成员方法。

    • void write(char[] cbuf);写入字符数组。
    • abstract void write(char[] cbuf, int off, int len);写入字符数组的某一部分。
    • void write(int c);写入单个字符。
    • void write(String str);写入字符串。
    • void write(String str, int off, int len);写入字符串的某一部分。
    • abstract void close();关闭此流,但要先刷新它。
    • abstract void flush();刷新该流的缓冲。
  • java.io.FileWriter extends OutputStreamWriter extends Writer:文件字符输出流

  • 作用:把内存中的字符数据写入到内存缓冲区中,调用flush或者close方法后才把转换的字节刷新到硬盘中的文件中

  • 构造方法:

    • FileWriter(File file);根据给定的 File 对象构造一个 FileWriter 对象。
    • FileWriter(String fileName);根据给定的文件名构造一个 FileWriter 对象。
    • 参数:
      • File file,String fileName:写入数据的目的地
  • 作用:

    1. 会创建一个FileWriter对象
    2. 根据构造方法中传递的参数创建一个文件
    3. 把FileWriter对象指向创建好的文件
  • 追加写:

    • 与OutpputStream类似,续写用两个参数的构造方法,换行用换行符号

Properties

  • java.util.Properties extends HashTable< K,V > implements Map< K,V >

  • Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。

  • Properties集合是唯一一个和IO流相结合的集合

    • 可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储。
    • 可以使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用。
  • 属性列表中每个键及其对应值都是一个字符串。

    • Properties集合是一个双列集合,key和value默认都是字符串。
  • Object setProperty(String key, String value);调用 Hashtable 的方法 put。

  • String getProperty(String key);用指定的键在此属性列表中搜索属性。

  • Set<String> stringPropertyNames();返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。

store

  • 使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储

  • void store(OutputStream out, String comments);以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。

  • void store(Writer writer, String comments);以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。

  • 参数:

    • OutputStream out:字节输出流,不能写入中文
    • Writer writer:字符输入流,可以写入中文
    • String comments:注释,用来解释说明保存的文件是做什么的,不能使用中文,因为会产生乱码,默认是unicode编码,一般使用“”空字符串
  • 使用步骤:

    1. 创建Properties集合对象,添加数据
    2. 创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地
    3. 使用Properties集合中的方法store
    4. 释放资源

load

  • 使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用

  • void load(InputStream inStream);从输入流中读取属性列表(键和元素对)。

  • void load(Reader reader);按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。

  • 参数:

    • InputStream inStream:字节输入流,不能读取含有中文的键值对
    • Reader reader:字符输入流,能读取还含有中文的键值对
  • 使用步骤:

    1. 创建Properties集合对象
    2. 使用Properties集合中的方法load读取保存键值对的文件
    3. 遍历Properties集合
  • 注意:

    1. 存储键值对的文件中,键与值默认的连接符号可以使用等号,空格,其他符号
    2. 存储键值对的文件中,可以使用#进行注释,被注释的键值对不会再被读取
    3. 存储键值对的文件中,键与值,默认都是字符串不用再加引号

BufferedInputStream

  • java.io.BufferedInputStream extends FilterInputStream extends InputStream:字节缓冲输入流

  • 构造方法:

    • BufferedInputStream(InputStream in);创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
    • BufferedInputStream(InputStream in, int size);创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
  • 参数:

    • InputStream in:字节输入流,给其增加一个缓冲区,提高读取效率
    • int size:指定的缓冲区大小,不写则是默认的
  • 使用步骤:

    1. 创建一个字节输入流对象,构造方法中绑定读取的数据源
    2. 创建一个BufferedInputStream对象,构造方法中传递字节输入流对象,提高字节输入流读取效率
    3. 使用BufferedInputStream对象中的方法read读取文件
    4. 释放资源

BufferedOutputStream

  • java.io.BufferedOutputStream extends FilterOutputStream extends OutputStream:字节缓冲输出流

  • 构造方法:

    • BufferedOutputStream(OutputStream out);创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
    • BufferedOutputStream(OutputStream out, int size);创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
  • 参数:

    • OutputStream out:字节输出流,给传递的参数添加一个缓冲区,提高它的写入效率
    • int size:指定缓冲流内部缓冲区的大小,不指定则为默认大小
  • 使用步骤:

    1. 创建一个字节输出流对象
    2. 创建BufferedOutputStream对象,构造方法中传递字节输出流对象,提高它的效率
    3. 使用BufferedOutputStream对象中的方法write把数据写入到内部的缓冲区中
    4. 使用BufferedOutputStream中的方法flush把内部缓冲区中的数据刷新到文件中
    5. 释放资源

缓冲流原理

tqfXvt.jpg


BufferedReader

  • java.io.BufferedReader extends Reader:字符缓冲输入流

  • 构造方法:

    • BufferedReader(Reader in);创建一个使用默认大小输入缓冲区的缓冲字符输入流。
    • BufferedReader(Reader in, int sz);创建一个使用指定大小输入缓冲区的缓冲字符输入流。
  • 参数:

    • Reader in:字符输入流,缓冲流为其增加一个缓冲区,提高读取的效率
    • int sz;指定缓冲流的缓冲区大小,不写则为默认
  • 特有的成员方法:

    • String readLine();读取一个文本行。 读取一行数据
      • 行的终止符号:通过下列字符之一即可认为某行已终止:换行 (‘\n’)、回车 (‘\r’) 或回车后直接跟着换行(\r\n)。
      • 返回值:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
  • 使用步骤:

    1. 创建字符缓冲输入流对象,构造方法中传递字符输入流
    2. 使用字符缓冲输入流对象中的方法read/readLine读取文本
    3. 释放资源

BufferedWriter

  • java.io.BufferedWriter extends Writer:字符缓冲输出流

  • 构造方法:

    • BufferedWriter(Writer out);创建一个使用默认大小输出缓冲区的缓冲字符输出流。
    • BufferedWriter(Writer out, int sz);创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
  • 参数:

    • Writer out:字符输出流,缓冲流会给其一个缓冲区,提高写入的效率
    • int sz:指定缓冲区的大小,不写则默认大小
  • 特有的成员方法:

    • void newLine();写入一个行分隔符。会根据不同的操作系统获取不同的行分隔符
  • 使用步骤:

    1. 创建一个字符缓冲输出流对象,构造方法中传递字符输出流
    2. 调用字符缓冲输出流的方法write,把数据写入到内存缓冲区中
    3. 调用flush方法
    4. 释放资源

InputStreamReader

  • java.io.InputStreamReader extends Reader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。(解码)

  • 构造方法:

    • InputStreamReader(InputStream in);创建一个使用默认字符集的 InputStreamReader。
    • InputStreamReader(InputStream in, String charsetName);创建使用指定字符集的 InputStreamReader。
    • 参数:
      • InputStream in:字节输入流,用来读取文件中保存的字节
      • String charsetName:指定的编码表名称
  • 使用步骤:

    1. 创建一个InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
    2. 使用InputStreamReader对象中的方法读取文件
    3. 释放资源
  • 注意:构造方法中指定的编码表要和文件编码相同,否则会发生乱码


OutputStreamWriter

  • java.io.OutputStreamWriter extends Writer:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。(编码)

  • 构造方法:

    • OutputStreamWriter(OutputStream out);创建使用默认字符编码的 OutputStreamWriter。
    • OutputStreamWriter(OutputStream out, String charsetName);创建使用指定字符集的 OutputStreamWriter。
    • 参数:
      • OutputStream out:字节输出流,可以用来写转换之后的文件到文件中
      • String charsetName:指定的编码表名称,不区分大小写
  • 使用步骤:

    1. 创建一个OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
    2. 使用OutputStreamWriter对象中的方法write把字符转换为字节,存储到缓冲区中
    3. 使用OutputStreamWriter中的方法flush把缓冲区的字节刷新到文件中(使用字节流写字节的过程)
    4. 释放资源

ObjectInputStream

  • java.io.ObjectInputStream extends InputStream:对象的反序列化流,把文件中保存的对象以流的方式读取出来使用

  • 构造方法:

    • ObjectInputStream(InputStream in);创建从指定 InputStream 读取的 ObjectInputStream。
    • 参数:
      • InputStream in:字节输入流
  • 特有的成员方法:

    • Object readObject();从 ObjectInputStream 读取对象。
  • 使用步骤:

    1. 创建一个ObjectInputStream对象,构造方法中传递字节输入流
    2. 使用ObjectInputStream对象中的方法readObject读取保存对象的文件
    3. 释放资源

ObjectOutputStream

  • java.io.ObjectOutputStream extends OutputStream:对象的序列化流,把对象以流的方式写入到文件中保存

  • 构造方法:

    • ObjectOutputStream(OutputStream out);创建写入指定 OutputStream 的 ObjectOutputStream。
    • 参数:
      • OutputStream out:字节输出流
  • 特有的成员方法:

    • void writeObject(Object obj);将指定的对象写入ObjectOutputStream。
  • 使用步骤:

    1. 创建一个ObjectOutputStream对象,构造方法中传递字节输出流
    2. 使用ObjectOutputStream对象中的方法writeObject把对象写入到文件中
    3. 释放资源

对象的序列化与反序列化

  • 当这个类创建的对象需要序列化时,必须实现Serializable接口,不然会抛出NotSerializableException异常
  • Serializable也叫标记型接口:要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
  • 当我们进行序列化和反序列化的时候,就会检测类上是否有标记,如果有,就可以序列化和反序列化如果没有,就会抛出异常

tq4PeK.jpg

  • 序列化时可能会遇到的序列号问题InvalidClassException的解决方案:手动添加一个序列号
    tq4Wm6.jpg
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信