zoukankan      html  css  js  c++  java
  • 我的学习之路_第十一章_字符流

    【字符流】

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

  • 相关阅读:
    hdu 5115 区间dp ***
    CF 149D Coloring Brackets 区间dp ****
    区间dp总结
    hdu 5284 BestCoder Round #48 ($) 1001 水题 *
    vijos 1038 括号+路径 ***
    vijos 1037 ***
    vijos 1028 LIS *
    使用alpine 构建 golang 运行容器
    Go Http包解析:为什么需要response.Body.Close()
    如果open的file不close , 会有什么样的影响
  • 原文地址:https://www.cnblogs.com/jia-/p/7029464.html
Copyright © 2011-2022 走看看