20201016+袁鑫

学习日志

知识总结

字符流

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

输入流

输入字符流(Reader)

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

image-20201016142226906

public abstract class Reader implements Readable Closeable

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

构造方法

Reader提供了两个构造方法供子类使用

protected Reader()
protected Reader(object lock)//用于同步针对此流的操作的对象
实例方法

它定义了字符输入流的基本共性功能方法。

  • public void close ( ) : 关闭此流并释放与此流相关联的任何系统资源
  • public int read ( ) : 从输入流读取一个字符。
  • public int read(char [] cbuf ) : 从输入流中读取一些字符
  • public abstract int read (read [] cbuf, int off ,int len ) :从输入流中读取一些字符
  • 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 ) 是抽象方法,所以子类必须实现此方法。

FileReader

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

public class FileReader extends InputStreamReader
构造方法
FileReader(File file) //创建一个新的FileReader , 给定要读取的File对象。
FileReader(String fileName) //创建一个新的FileReader,给定要读取的文件的名称。
File file = new File("文件目录");
FileReader reader = new FileReader(file);
FileReader reader1 = new FileReader("文件目录");

构造方法内部都是调用了父类的构造方法,传入一个FileInputStream对象。

实例方法

FileReader中的所有方法都来自其父类InputStreamReader,没有重写任何方法同时也没有扩展的方法。

读取单个字符

read ( ) 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1,循环读取

FILEReader fr = new FileReader("文件目录");
int ch = fr.read();//读取单个字节
System.out.println((char)ch);
fr.close();//关闭流
读取多个字符

read(char [] cbuf),每次读取cbuf 的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回-1

BufferedReader

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

public class BufferedReader extends Reader
构造方法
public BufferedReader(Reader in )
public BufferedReader(Reader in , int sz)
    //sz是指定大小的输入缓冲区
读取一行字符
public String readLine() //读取一行文字

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

InputStreamReader

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

public class InputStreamReader extends Reader
构造方法
//创建一个使用默认字符集的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)

前三个是最常用的

实例方法

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

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

其他方法在之前都有讲过,所有在此不再描述,

指定编码读取

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

InputStreamReader isr = new InputStreamReader(new FileInputStream(FileName),"GBK");
输出流

字符输出流【Writer】

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

Writer 体系:

image-20201016220308473

public abstract class Writer implements Appendable,Closeable,Flushable
构造方法

Writer 提供了两个构造方法

protected Writer();
protected Writer(Object lock)
实例方法

Writer类中提供了以下方法:

  • public abstract void close() : 关闭此输出流并释放与此流相关联的任何系统资源。
  • public abstract void flush() : 刷新次输出流并强制任何缓冲的输出字符被写出。
  • public void write( int c ) : 写出一个字符。
  • public void write ( char [] cbuf) : 将 cbuf,length 字符从指定的字符数组写出此输出流。
  • public abstract void write (char[] b,int off, int len ) : 从指定的字符数组写出len字符,从偏移量 off 开始输出到此输出流。
  • public void writer ( String str) :写出一个字符串。
FileWriter

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统会默认的字符编码和默认字节缓冲区。

public class FileWriter extends OutputStreamWriter
构造方法
//构造一个给定文件名的FileWriter对象
public FileWriter ( String fileName);
//构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据
public FileWriter(String fileName,boolean append);
//给一个File对象构造一个FileWriter对象
public FileWriter (File file);
//给一个File对象构造一个FileWriter对象,
public FileWriter(File file , boolean append);
//构造与文件描述符关联的FileWriter对象
public FileWriter(FileDescriptor fd)
实例方法

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

学出单个字符

Writer(int b)方法,每次可以写出一个字符数据。

学出多个字符

writer(char [] cbuf)

writer(char [] b, int off, int len)

BufferedWriter

java.io.BufferedWriter 是将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高校写入。可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途。是一个缓冲流。

public class BufferedWriter extends Writer
构造方法
//创建使用默认大小的输出缓冲区的缓冲字符输出流
public BufferedWriter(Writer out);
//创建一个心得缓冲字符输出流,使用给定大小的输出缓冲区
public BufferedWriter(Writer out,int sz);
实例方法

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

//写一个行分隔符,由系统属性定义符号
public void newLine();
OutputStreamWriter

java.io.OutputStreamWriter,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。他的字符集可以由名称指定,也可以接受平台的默认字符集。

public class OutputStreamWriter extends Writer

构造方法

//创建一个使用默认字符编码的OutputStreamWriter
public OutputStreamWriter(OutputStream out);
//创建一个使用命名字符集的OutputStreamWriter。
public OutputStreamWriter(OutputStream out, String charsetName);
//创建一个使用给定字符集的OutputStreamWriter
public OutputStreamWriter(OutputStream out, Charset cs);
//创建一个使用给定字符集编码器的OutputStreamWriter
public OutputStreamWriter(OutputStream out, CharsetEncoder enc);
实例方法

OutputStreamWrter 的方法大都继承自 Writer ,除了 getEncoding() 方法。

增强try

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

try (FileOutputStream out = new FileOutputStream("d:/temp/outStreamWriter.txt"); OutputStreamWriter writer =
new OutputStreamWriter(out, set);){
    System.out.println("编码格式为: " + writer.getEncoding());
    writer.write("站在那别动,我去买橘子");
} catch (IOException e) {
    e.printStackTrace();
}

注意:只要这些资源实现类实现了 CloseableAutoCloseable 接口,就可以自动关闭。几乎所有的 资源都可以用这种方式实现自动关闭资源。

如果 try() 里面有多个资源,用 ; 分开,资源的 close 方法的调用顺序与它们的创建顺序相反。带有资 源的try语句可以像一般的try语句一样具有catch和finally块。在try-with-resources语句中,任何catch 或finally块都是在声明的资源被关闭后才会执行的

心得:

这两天的学习大多数都是很多工具,当前阶段应该把他们的特性,什么时候使用,怎么用弄清楚,这说起来简单,却需要大量练习。

标签

评论

this is is footer