JavaIO

github

字节流和字符流

  • 字节流:数据流中最小的数据单元是字节
  • 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。

字节流

输入流

基本类
  • InputStream是所有的输入字节流的父类,它是一个抽象类。
  • ByteArrayInputStreamStringBufferInputStreamFileInputStream是三种基本的介质流,它们分别从Byte数组StringBuffer、和本地文件中读取数据。
  • PipedInputStream是从与其它线程共用的管道中读取数据。
  • ObjectInputStream和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)
  • PushbackInputStream的功能是查看最后一个字节,不满意就放入缓冲区。主要用在编译器的语法、词法分析部分。输出部分的BufferedOutputStream几乎实现相近的功能。
  • StringBufferInputStream已经被Deprecated,本身就不应该出现在InputStream部分,主要因为String应该属于字符流的范围。已经被废弃了,当然输出部分也没有必要需要它了!还允许它存在只是为了保持版本的向下兼容而已。
  • SequenceInputStream可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从IO包中去除,还完全不影响IO包的结构,却让其更“纯洁”――纯洁的Decorator模式。
基本读方法
  • int read():
    读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。
  • int read(byte[] b):
    将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。
  • int read(byte[] b, int off, int len):
    将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
其他方法
  • long skip(long n):
    在输入流中跳过n个字节,并返回实际跳过的字节数。
  • int available() :
    返回在不发生阻塞的情况下,可读取的字节数。
  • void close() :
    关闭输入流,释放和这个流相关的系统资源。
  • voidmark(int readlimit) :
    在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。
  • void reset() :
    返回到上一个标记。
  • booleanmarkSupported() :
    测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。

输出流

基本类
  • OutputStream是所有的输出字节流的父类,它是一个抽象类。
  • ByteArrayOutputStreamFileOutputStream是两种基本的介质流,它们分别向Byte数组、和本地文件中写入数据。
  • PipedOutputStream是向与其它线程共用的管道中写入数据。
  • ObjectOutputStream和所有FilterOutputStream的子类都是装饰流。
基本写方法
  • void write(int b):
    往输出流中写入一个字节。
  • void write(byte[] b) :
    往输出流中写入数组b中的所有字节。
  • void write(byte[] b, int off, int len) :
    往输出流中写入数组b中从偏移量off开始的len个字节的数据。
其他方法
  • void flush() :
    刷新输出流,强制缓冲区中的输出字节被写出。
  • void close() :
    关闭输出流,释放和这个流相关的系统资源。

字符流

输入流

基本类
  • Reader是所有的输入字符流的父类,它是一个抽象类。
  • CharReaderStringReader是两种基本的介质流,它们分别将Char数组String中读取数据。
  • PipedReader是从与其它线程共用的管道中读取数据。
  • BufferedReader很明显就是一个装饰器,它和其子类负责装饰其它Reader对象。
  • FilterReader是所有自定义具体装饰流的父类,其子类PushbackReaderReader对象进行装饰,会增加一个行号。
  • InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream转变为Reader的方法。我们可以从这个类中得到一定的技巧。Reader中各个类的用途和使用方法基本和InputStream中的类使用一致。后面会有Reader与InputStream的对应关系。
基本读方法
  • public int read() throws IOException:
    读取一个字符,返回值为读取的字符。
  • public int read(char cbuf[]) throws IOException:
    读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量。
  • public abstract int read(char cbuf[],int off,int len) throws IOException:
    读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现。

输出流

基本类
  • Writer是所有的输出字符流的父类,它是一个抽象类。
  • CharArrayWriterStringWriter是两种基本的介质流,它们分别向Char数组String中写入数据。
  • PipedWriter是向与其它线程共用的管道中写入数据,
  • BufferedWriter是一个装饰器为Writer提供缓冲功能。
  • PrintWriterPrintStream极其类似,功能和使用也非常相似。
  • OutputStreamWriterOutputStreamWriter转换的桥梁,它的子类FileWriter其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream极其类似.
基本写方法
  • public void write(int c) throws IOException:
    将整型值c的低16位写入输出流
  • public void write(char cbuf[]) throws IOException:
    将字符数组cbuf[]写入输出流
  • public abstract void write(char cbuf[],int off,int len) throws IOException:
    将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流
  • public void write(String str) throws IOException:
    将字符串str中的字符写入输出流
  • public void write(String str,int off,int len) throws IOException:
    将字符串str 中从索引off开始处的len个字符写入输出流

区别

字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
github
字符流需要操作flush()函数后方可将缓存数据推送制定文件中。