java-IO流笔记

IO流的分类

  • 按照数据的流向

  • 输入流:读数据

  • 输出流:写数据

  • 按照数据类型来分

  • 字节流
  • 字节输入流

  • 字节输出流

  • 字符流
  • 字符输入流

  • 字符输出流

IO流的使用场景

  • 如果操作的是纯文本文件,优先使用字符流

  • 如果操作的是图片、视频、音频等二进制文件,优先使用字节流

  • 如果不确定文件类型,优先使用字节流.字节流是万能的流

字节流写数据

  • 字节流抽象基类

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

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

  • 子类名特点:子类名称都是以其父类名作为子类名的后缀

  • 字节输出流

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

  • 使用字节输出流写数据的步骤
  • 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)

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

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

代码实例:

字节流写数据的三种方式

//将指定的字节写入此文件输出流 一次写一个字节数据

void write(int b)

//将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据

void write(byte[] b)

//将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据

void write(byte[] b, int off, int len)

代码实例:

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

字节流写数据如何实现换行
  • windows:\r\n

  • linux:\n

  • mac:\r

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

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

代码实例:

字节流写数据加异常处理

异常处理格式
  • try-catch-finally

try{

可能出现异常的代码;

}catch(异常类名 变量名){

异常的处理代码;

}finally{

执行所有清除操作;

}

finally特点
  • 被finally控制的语句一定会执行,除非JVM退出

代码实例:

字节流读数据

字节输入流

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

字节输入流读取数据的步骤
  • 创建字节输入流对象

  • 调用字节输入流对象的读数据方法

  • 释放资源

代码实例:

字节缓冲流

字节缓冲流介绍

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

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

字节缓冲流构造方法

//创建字节缓冲输出流对象

BufferedOutputStream(OutputStream out)

//创建字节缓冲输入流对象

BufferedInputStream(InputStream in)

字符流

为什么会出现字符流

字符流的介绍

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

字符流 = 字节流 + 编码表

中文的字节存储方式

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?

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

字符串中的编码解码问题

//使用平台的默认字符集将该 String编码为一系列字节

byte[] getBytes()

//使用指定的字符集将该 String编码为一系列字节

byte[] getBytes(String charsetName)

//使用平台的默认字符集解码指定的字节数组来创建字符串

String(byte[] bytes)

//通过指定的字符集解码指定的字节数组来创建字符串

String(byte[] bytes, String charsetName)

字符流写数据

介绍

Writer: 用于写入字符流的抽象父类

FileWriter: 用于写入字符流的常用子类

构造方法

//根据给定的 File 对象构造一个 FileWriter 对象

FileWriter(File file)

//根据给定的 File 对象构造一个 FileWriter 对象

FileWriter(File file, boolean append)

//根据给定的文件名构造一个 FileWriter 对象

FileWriter(String fileName)

//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象

FileWriter(String fileName, boolean append)

成员方法

//写一个字符

void write(int c)

//写入一个字符数组

void write(char[] cbuf)

//写入字符数组的一部分

void write(char[] cbuf, int off, int len)

//写一个字符串

void write(String str)

//写一个字符串的一部分

void write(String str, int off, int len)

刷新和关闭的方法

//刷新流,之后还可以继续写数据

flush()

//关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

close()

代码实例:

字符流读数据

介绍

Reader: 用于读取字符流的抽象父类

FileReader: 用于读取字符流的常用子类

构造方法

//在给定从中读取数据的 File 的情况下创建一个新 FileReader

FileReader(File file)

//在给定从中读取数据的文件名的情况下创建一个新 FileReader

FileReader(String fileName)

成员方法

//一次读一个字符数据

int read()

//一次读一个字符数组数据

int read(char[] cbuf)

字符缓冲流

字符缓冲流介绍

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

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

构造方法

//创建字符缓冲输出流对象

BufferedWriter(Writer out)

//创建字符缓冲输入流对象

BufferedReader(Reader in)

字符缓冲流特有功能

方法介绍

BufferedWriter:

//写一行行分隔符,行分隔符字符串由系统属性定义

void newLine()

BufferedReader:

//读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符如果流的结尾已经到达,则为null

String readLine()

转换流

字符流中和编码解码问题相关的两个类

  • InputStreamReader:是从字节流到字符流的桥梁,父类是Reader

它读取字节,并使用指定的编码将其解码为字符

它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

  • OutputStreamWriter:是从字符流到字节流的桥梁,父类是Writer

是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节

它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

转换流读写数据

构造方法

//使用默认字符编码创建InputStreamReader对象

InputStreamReader(InputStream in)

//使用指定的字符编码创建InputStreamReader对象

InputStreamReader(InputStream in,String chatset)

//使用默认字符编码创建OutputStreamWriter对象

OutputStreamWriter(OutputStream out)

//使用指定的字符编码创建OutputStreamWriter对象

OutputStreamWriter(OutputStream out,String charset)

对象操作流

对象序列化流

对象序列化介绍

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

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

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

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

对象序列化流: ObjectOutputStream

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

构造方法

//创建一个写入指定的OutputStream的ObjectOutputStream

ObjectOutputStream(OutputStream out)

方法名

//将指定的对象写入ObjectOutputStream

void writeObject(Object obj)

代码实例:

注意事项

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

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

对象反序列化流

对象反序列化流: ObjectInputStream

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

构造方法

//创建从指定的InputStream读取的ObjectInputStream

ObjectInputStream(InputStream in)

反序列化对象的方法

//从ObjectInputStream读取一个对象

Object readObject()

代码实例:

serialVersionUID&transient

  • serialVersionUID
  • 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?

  • 会出问题,会抛出InvalidClassException异常

  • 如果出问题了,如何解决呢?

  • 重新序列化

  • 给对象所属的类加一个serialVersionUID

  • private static final long serialVersionUID = 42L;

  • transient
  • 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?

  • 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

代码实例:

Properties集合

Properties作为Map集合的使用

  • Properties介绍
  • 是一个Map体系的集合类

  • Properties可以保存到流中或从流中加载

  • 属性列表中的每个键及其对应的值都是一个字符串

  • Properties基本使用

代码实例:

Properties作为Map集合的特有方法

特有方法

//设置集合的键和值,都是String类型,底层调用 Hashtable方法 put

Object setProperty(String key, String value)

//使用此属性列表中指定的键搜索属性

String getProperty(String key)

//从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串

Set<String> stringPropertyNames()

Properties和IO流相结合的方法

和IO流结合的方法

//从输入字符流读取属性列表(键和元素对)

void load(Reader reader)

//将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流

void store(Writer writer, String comments)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值