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

来源:互联网 发布:网络宣传计划书范文 编辑:程序博客网 时间:2024/06/18 05:35
【字符流】


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) 文件夹复制