首页 > 代码库 > 我的学习之路_第十一章_字符流

我的学习之路_第十一章_字符流

【字符流】

IO流的分类

★字节流 操作的文件不是文本文件

字节输入流: InputStream 抽象类

FileInputStream操作文件的字节输入流

字节输出流: OutputStream 抽象类

FileOutputStream操作文件的字节输出流


★字符流 操作的文件是文本文件

字符输入流: Reader 抽象类

FileReader 用来操作文件的字符输入流

字符数出流: Writer 抽象类

FileWriter 用来操作文件的字符输出流


【转换流】

▲OutputStreamWriter extends Writer 所属包:java.io.OutputStreamWriter

作用:是字符流通向字节流的桥梁,可以指定编码表

继承自父类 Writer 的公共成员方法

写一个字符,写字符数组,写字符数组的一部分,写字符串,写字符的一部分,刷新,关闭

构造方法:

OutputStreamWriter(OutputStream out,String charsetName) 创建使用指定字符集的 OutputStreamWriter

参数:
OutputStream out : 字节输出流(把转换后的字节写入到文件中)
可以传入FileOutputStream
String charsetName : 编码表名称
可以传入一个字符串格式的编码表名称,比如"GBK","utf-8"...,编码表名称不区分大小写,如果不写默认为系统码表
使用步骤:
1.创建字符输出流FileOutputStream,绑定数据的目的地
2.创建转换流OutputStreamWriter对象,构造方法中传入FileOutputStream和指定的编码表名称
3.调用OutputStreamWriter中写数据的方法,把数据写入到内存缓冲区中
4.释放资源,并把数据刷新到文件中


▲InputStreamReader extends Reader

作用:是字符流通向字节流的桥梁,可以指定编码表

继承自父类 Writer 的公共成员方法

int read() 读取单个字符.
int read(char[] cbuf) 将字符读入数组
abstract void close() 关闭该流并释放与之关联的所有资源.

构造方法:

InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader
InputStreamReader(InputStream in,String charsetName) 创建使用指定字符集的 InputStreamReader

参数: InputStream in:字节输入流(把文件中保存的字节读取出来)
可以传入FileInputStream
String charsetName:编码表名称
可以传入一个字符串格式的编码表名称,比如"GBK","utf-8"...,编码表名称不区分大小写,如果不写默认为系统码表


使用步骤:
1.创建字节输入流FileInputStream对象,绑定数据源
2.创建转换流InputStreamReader对象,构造方法中,传入FileInputStream和指定的编码表名称
3.使用InputStreamReader读取数据的方法,读取数据
4.释放资源

★ 注意:构造方法中指定的编码名称,必须和要读取的文件保持一致,否则会出现乱码


【序列化流和反序列化流】

【对象的序列化:把对象以流的方式写入到文件中保存】

●构造方法:
ObjectOutputStream(OutputStream out) 创建写入指定OutputStream 的 ObjectOutputStream
参数:
OutputStream out: 字节流,可以传入FileOutputStream.

使用步骤:
1.创建对象,并赋值
2.创建字节输出流对象FileOutputStream,绑定数据目的地
3.创建序列化流ObjectOutputStream对象,构造方法中传入FileOutputStream
4.使用ObjectOutputStream中的方法writeObject,把对象写入到文件中
5.释放资源
★注意:
要序列化的类如果没有实现Serializable接口,会抛出NotSerializableException异常

【对象的反序列化:把文件中保存的对象,以流的方式读取出来】

●构造方法:
ObjectInputStream(InputStream in)创建从指定InputStream 读取的ObjectInputStream.
参数:
InputStream in :字节流,可以传入FileInputStream

读对象的方法:
返回值:Object readObject() 从ObjectInputStream读取对象.

使用步骤:
1:创建字节输入流FileInputStream,绑定数据源
2:创建反序列化流ObjectInputStream,构造方法中传入FileInputStream
3.使用ObjectInputStream中的方法readObject,读取文件中保存的对象
4.释放资源
5.打印对象

★注意:
方法readObjec,会抛出ClassNotFoundException(没有class文件异常)
反序列化的前提,必须有对象的class文件存在.

 


〓类通过实现java.io.Serializable接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化

Serializable接口:称之为标记型接口
类只有实现了Serializable才能序列化和反序列化,不实现就不能

★序列化和反序列的是对象,如果对象中有静态的属性,可以序列化吗?

静态属于类,不属于对象,不能序列化
不管是静态属性和非静态属性都有默认值
如果是静态属性,不能被序列化,那么就使用它的默认值

瞬态关键字 【 transient 】 :作用, 阻止成员变量序列化


【打印流】

字节打印流:PrintStream extends OutputStream
字符打印流:PrintWriter extends Writer

两个打印流中的方法完全一致:
void print(Object obj) 输出任意类型的数据
void println(Object obj) 输出任意类型的数据,自动写入换行操作

构造方法: 就是打印流的输出目的端

PrintStream
构造方法目的地:接受File类型,接收字符串文件名,接收字节输出流OutputStream
PrintWriter
构造方法目的地:接受File类型,接收字符串文件名,接收字节输出流OutputStream

★注意事项:
字节流写入数据的时候,会直接把数据写入到文件中
字符流写入数据的时候,会把数据写入到内存缓冲区中,必须刷新或者关闭,才会把数据有缓冲区刷新到文件中


字符打印流的自动刷新功能:

1.字符打印刘的输出的目的地必须是一个流对象(字符,字节)
2.字符打印流构造方法的参数autoFlush必须是true
3.必须使用 println、printf 或 format 方法中的一个才能实现

包含自动刷新的构造方法:

PrintWriter(OutputStream out, Boolean autoFlush)
PrintWriter(Writer out, boolean autoFlush)
我们可以把字符串的目的地和File类的目的地转换为流,开启自动刷新


【Properties类】

Properties集合 extends Hashtable implements Map 集合 所属包:java.util.Properties

Properties集合的特点:
1:键和值默认都是String类型
2:集合中有自己特有的方法
返回值:Object SetProperty(String key,String value) 调用Hashtable的方法 put.
返回值:String getProperty(String key) 用指定的键在此属性列表搜索属性. 相当于Map集合中的get(Key k) 方法
返回值Set<String> StringPropertyNames() 返回此属性列表中的键集 相当于Map集合中的keySet.

3:和IO流相结合的方法
使用store 方法把集合中保存的临时数据,持久化到硬盘的文件中保存
返回值:void store(OutputStream out, String cpmments)
返回值:void store(Writer writer, String comments)
方法参数:
OutputStream out:不能操作中文
Writer writer:可以操作中文
String comments:注释,保存数据的用途,可以写null,不能写中文,默认使用unicode编码

使用步骤:
1.创建Properties集合,添加数据
2.创建字节输出流或者字符输出流对象,绑定目的地
3.使用Properties集合中的方法store把集合中的数据,写入到文件中
4.释放资源

 


使用load方法把硬盘文件中保存的键值对,读取出来,放入到Properties集合中
返回值:void load(InputStream inStream)
返回值:void load(Reader reader)
方法的参数:
InputStream inStream:不能读取包含中文的键值对
Reader reader: 可以读取包含中文的键值对

使用步骤:
1.创建创建Properties集合
2.创建字节输入流/字符输入对象,绑定数据源
3.使用Properties中的方法load,读取文件中保存的键值对,把键值对保存到集合中
4.释放资源
5.遍历Properties集合
★注意:
prop.properties文件中使用#号可以注释一行
prop.properties文件中key和value默认就是字符不用使用""
prop.properties文件中key和value之间可以使用=连接也可以使用空格


【Commons-IO】

使用commons-IO中提供的工具类FileUtils
方法都是静态的 static 可以通过类名直接使用 方法的参数都是File类型

readFileToString(File file):读取文件内容,并返回一个String

writeStringToFile(File file ,String content): 将内容content写入到file中;

copyFile(File srcFile, File destFile): 文件复制

copyDirectoryToDirectory(File srcDir , File destDir) 文件夹复制

我的学习之路_第十一章_字符流