java下的字符流

时间:2023-02-13 00:08:32

输入流和输出流相对于内存设备而言.

将外设中的数据读取到内存中:输入
将内存的数写入到外设中:输出。

字符流的由来:
其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。比如,字符是按照UTF-8编码的,那么每次读的时候,都会从
磁盘上先连续读取三个字节,然后把这个三个字节去utf-8编码中寻找对应的字符。列 。中文的“中”,假设其UTF-8的编码是 “0xf4,0x32,0x12”。那么如果
读取到这上个字节后,就会被转化成中文的“中”字。在对这个文字进行操作。简单说:字节流+编码表

---------------------------------------

字节流的两个顶层父类:
1,InputStream  2,OutputStream.

字符流的两个顶层父类:
1,Reader 2,Writer

这些体系的子类都以父类名作为后缀。
而且子类名的前缀就是该对象的功能。

就从熟悉的文字开始字符流,

//需求:将一些文字存储到硬盘一个文件中。
记住;如果要操作文字数据,建议优先考虑字符流。
而且要将数据从内存写到硬盘上,要使用字符流中的输出流。Writer
硬盘的数据基本体现是文件。 希望找到一个可以操作文件的Writer.
找到了FileWriter
FileWriter(String fileName)
          根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
FileWriter(File file)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd)
          构造与某个文件描述符相关联的 FileWriter 对象。
其中,append表示添加,也就是在原有的东西后面添加字符,如果没有这个append参数,那么新创建的
文件会覆盖之前的旧文件,并且新文件为空。
write
public void write(int c) throws IOException写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。
用于支持高效单字符输出的子类应重写此方法。
参数:c - 指定要写入字符的 int。
抛出: IOException - 如果发生 I/O 错误

public void write(char[] cbuf) throws IOException写入字符数组。
参数:cbuf - 要写入的字符数组
抛出: IOException - 如果发生 I/O 错误

public abstract void write(char[] cbuf,int off,int len) throws IOException写入字符数组的某一部分。
参数:cbuf - 字符数组
      off - 开始写入字符处的偏移量
      len - 要写入的字符数
抛出:IOException - 如果发生 I/O 错误

public void write(String str) throws IOException写入字符串。
参数:str - 要写入的字符串
抛出: IOException - 如果发生 I/O 错误

public void write(String str,int off,int len) throws IOException写入字符串的某一部分。
参数:str - 字符串
      off - 相对初始写入字符的偏移量
      len - 要写入的字符数
抛出: IndexOutOfBoundsException - 如果 off 或 len 为负,或者 off+len 为负或大于给定字符串的长度
IOException - 如果发生 I/O 错误

flush
public abstract void flush() throws IOException刷新该流的缓冲。如果该流已保存缓冲区中各种 write() 方法的所有字符,则立即将它们写入预期目标。然后,如果该目标是另一个字符或字节流,则将其刷新。因此,一次 flush() 调用将刷新 Writer 和 OutputStream 链中的所有缓冲区。
如果此流的预期目标是由底层操作系统提供的一个抽象(如一个文件),则刷新该流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
指定者:接口 Flushable 中的 flush
抛出: IOException - 如果发生 I/O 错误

close
public abstract void close() throws IOException关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。
指定者:接口 Closeable 中的 close
抛出: IOException - 如果发生 I/O 错误

//需求:读取一个文本文件。将读取到的字符打印到控制台.
同上,找到了FileReader
FileReader(File file)
FileReader(String fileName)
FileReader(FileDescriptor fd)

read
public int read() throws IOException读取单个字符。
覆盖:类 Reader 中的 read
返回:读取的字符,如果已到达流的末尾,则返回 -1
抛出: IOException - 如果发生 I/O 错误

read public int read(char[] cbuf,int offset,int length) throws IOException将字符读入数组中的某一部分。
指定者:类 Reader 中的 read
参数:cbuf - 目标缓冲区
      offset - 从其处开始存储字符的偏移量
      length - 要读取的最大字符数
返回:读取的字符数,如果已到达流的末尾,则返回 -1
抛出: IOException - 如果发生 I/O 错误