java中I/O流之字节流和字符流

258 阅读2分钟

java IO相关的类很多,不常用的很难记得住,可以参考这篇文章,总结了Java的IO体系。

从数据来源或者说是操作对象角度看,IO 类可以分为:

  1. 文件(file):FileInputStream、FileOutputStream、FileReader、FileWriter
  2. 数组([]):
    • 字节数组(byte[]):ByteArrayInputStream、ByteArrayOutputStream
    • 字符数组(char[]):CharArrayReader、CharArrayWriter
  3. 管道操作:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter
  4. 基本数据类型:DataInputStream、DataOutputStream
  5. 缓冲操作:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
  6. 打印:PrintStream、PrintWriter
  7. 对象序列化反序列化:ObjectInputStream、ObjectOutputStream
  8. 转换:InputStreamReader、OutputStreWriter

从数据传输方式或者说是运输方式角度看,可以将 IO 类分为: 1、字节流 2、字符流

IO 类虽然很多,但最基本的是 4 个抽象类:InputStream、OutputStream、Reader、Writer。最基本的方法也就是一个读 read() 方法、一个写 write() 方法。具体的例子可以参考上面的链接。

我们常用的也就是文件相关的几个类,如文件最基本的读写类 File 开头的、文件读写带缓冲区的类 Buffered 开头的类,对象序列化反序列化相关的类 Object 开头的类。

InputStream 类

  • public abstract int read() 读取数据
  • public int read(byte b[]) 将读取到的数据放在 byte 数组中,该方法实际上是根据下面的方法实现的,off 为 0,len 为数组的长度
  • public int read(byte b[], int off, int len) 从第 off 位置读取 len 长度字节的数据放到 byte 数组中,流是以 -1 来判断是否读取结束的

OutputStream 类

  • public abstract void write(int b) 写入一个字节,可以看到这里的参数是一个 int 类型,对应上面的读方法,int 类型的 32 位,只有低 8 位才写入,高 24 位将舍弃。
  • public void write(byte b[]) 将数组中的所有字节写入,和上面对应的 read() 方法类似,实际调用的也是下面的方法。
  • public void write(byte b[], int off, int len) 将 byte 数组从 off 位置开始,len 长度的字节写入

Reader 类

  • public int read(java.nio.CharBuffer target) 读取字节到字符缓存中
  • public int read() 读取单个字符
  • public int read(char cbuf[]) 读取字符到指定的 char 数组中
  • abstract public int read(char cbuf[], int off, int len) 从 off 位置读取 len 长度的字符到 char 数组中

Writer 类

  • public void write(int c) 写入一个字符
  • public void write(char cbuf[]) 写入一个字符数组
  • abstract public void write(char cbuf[], int off, int len) 从字符数组的 off 位置写入 len 数量的字符
  • public void write(String str) 写入一个字符串
  • public void write(String str, int off, int len) 从字符串的 off 位置写入 len 数量的字符
  • public Writer append(CharSequence csq) 追加吸入一个字符序列
  • public Writer append(CharSequence csq, int start, int end) 追加写入一个字符序列的一部分,从 start 位置开始,end 位置结束
  • public Writer append(char c) 追加写入一个 16 位的字符