20201016 王维

学习总结

1 字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字 符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数 据,专门用于处理文本文件。

2 输入流

2.1 输入字符流(Reader)

2.1.1 概述

java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。下面 是 Reader 的体系:

image-20201017085706230

public abstract class Reader implements Readable, Closeable

它是个抽象类,因此不能被实例化。

2.1.2 构造方法

protected Reader()
protected Reader(Object lock)

2.1.3 实例方法

  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read() : 从输入流读取一个字符。
  • public int read(char[] cbuf) : 从输入流中读取一些字符
  • public abstract int read(char[] cbuf, int off, int len) : 从输入流中读取一些字符
  • public int read(CharBuffer target) :将字符读入指定的字符缓冲区
  • public void mark(int readAheadLimit) :标记流中的位置
  • public boolean ready() : 流是否准备好被读取
  • public void reset() : 重置流
  • public long skip(long n) : 跳过字符

由于 public abstract int read(char[] cbuf, int off, int len) 是抽象方法,所以所有子类 必须实现此方法。

2.2 FileReader

2.2.1 概述

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲 区。

public class FileReader extends InputStreamReader

2.2.2 构造方法

FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。

2.2.3 实例方法

FileReader 中的所有方法都来自其父类 InputStreamReader ,没有重写任何方法同时也没有扩展的方 法。也就是说,学习了 FileReader 同时也学习了 InputStreamReader .

2.2.4 读取单个字符

2.2.5 读取多个字符

2.3 BufferedReader

2.2.1 概述

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

public class BufferedReader extends Reader

2.2.2 构造方法

//创建使用默认大小的输入缓冲区的缓冲字符输入流
public BufferedReader(Reader in)
//创建使用指定大小的输入缓冲区的缓冲字符输入流
public BufferedReader(Reader in, int sz)

2.2.3 读取一行字符

BufferedReader 继承了 Reader 中所有 public 方法,还扩展了一个方法:

public String readLine()//读取一行文字

当 readLine() 读取完毕时,返回 null

2.4 InputStreamReader

2.2.1 概述

java.io.InputStreamReader 是 Reader 的子类,是从字节流到字符流的桥:它读取字节,并使用指 定的 Charset 将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受 平台的默认字符集。

public class InputStreamReader extends Reader

2.2.2 构造方法

//创建一个使用默认字符集的InputStreamReader
public InputStreamReader(InputStream in)
//创建一个使用命名字符集的InputStreamReader
public InputStreamReader(InputStream in, String charsetName)
//创建一个使用给定字符集的InputStreamReader
public InputStreamReader(InputStream in, Charset cs)
//创建一个使用给定字符集解码器的InputStreamReader
public InputStreamReader(InputStream in, CharsetDecoder dec)

2.2.3 实例方法

InputStreamReader 继承了 Reader 中的所有 public 方法,并扩展了 getEncoding() 方法。

public String getEncoding()//获取使用的字符编码名称

2.2.4 指定编码获取

在创建 InputStreamReader 对象时,指定编码字符集。

package com.itlaobing.demo.pm;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderTest {
    public static void main(String[] args) throws IOException {
        // 定义文件路径,文件为gbk编码
        String FileName = "D:\\temp\\InputStreamReader.txt";
        // 创建流对象,默认UTF8编码
        InputStreamReader isr = new             InputStreamReader(new
FileInputStream(FileName));
        // 创建流对象,指定GBK编码
        InputStreamReader isr2 = new InputStreamReader(new
FileInputStream(FileName), "GBK");
        // 定义变量,保存字符
        int read;
        // 使用默认编码字符流读取,乱码
        while ((read = isr.read()) != -1) {
            System.out.print((char) read);
        }
        isr.close();
        System.out.println();
        // 使用指定编码字符流读取,正常解析
        while ((read = isr2.read()) != -1) {
            System.out.print((char) read);
        }
        isr2.close();
    }
}

3 输出流

3.1 字符输入流(Writer)

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。 下面是 Writer 的体系:

image-20201017090516257

public abstract class Writer implements Appendable, Closeable, Flushable

3.2 FileWriter

3.3 BufferedWriter

3.4 OutputStreamWriter

4 增强try

在 JDK 7 之前我们使用 try-catch 或 try-catch-finally 来处理异常。在使用资源的时最后都需要关 闭资源,所以一般我们在 finally 处关闭资源。比如:

public static void main(String[] args) throws IOException {
FileOutputStream out = null;
OutputStreamWriter writer = null;
try {
out = new FileOutputStream("d:/temp/outStreamWriter.txt");
Charset set = Charset.forName("utf-8");
writer = new OutputStreamWriter(out, set);
System.out.println("编码格式为: " + writer.getEncoding());
writer.write("站在那别动,我去买橘子");
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
writer.close();
out.close();
}
}

然而有的时候我们会忘记关闭资源。那么有没有更好的方法呢? 从 jdk1.7 开始, Java 7 增强了 try 语句的功能——它允许在 try 关键字后跟一对圆括号 () ,圆括 号可以声明,初始化一个或多个资源,此处的资源指得是那些必须在程序结束时必须关闭的资源(比如 流操作,数据库连接,网络连接等),try语句在该语句结束时自动关闭这些资源。这种称为 try-withresources 语句

5 序列化

心得体会

今天学习了字符流和序列化,字符流和我想象的不太一样,我以为字符流地层做了怎样复杂的判断,让他能够真的使用字符的方式进行读取或输出,但是他是通过获取系统的编码方式,然后再按照规定编码方式的字节数读取,虽然确实没问题,但还是想象的有差距。

标签

评论

this is is footer