7. jvm之io之字符流与字节流总括

1、Java IO 流

io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入、输出。

2、流的分类

输入流、输出流

A、输入流:只能从中读取数据,而不能向里面写数据
B、 输出流:只能向里面写数据,而不能读数据
可以这样理解,数据从内存到硬盘,通常认为是输出流,即写操作;相反,从硬盘到内存,通常认为是输入流,即读操作;这里的输入、输出是从内存的角度划分的。
Java的输入流主要有InputStream和Reader作为基类,而输出流则主要由OutputStream和Writer作为基类;

字节流和字符流

字节流和字符流区别非常简单,它们的用法几乎一样。区别在于字节流和字符流所操作的数据单元不同:字节流操作的最小单元数据是8位字节,而字符流作为最小数据单元是16为字节。
字节流主要由InputStream、OutputStream作为基类,而字符流则主要由Reader和Writer作为基类完成。

字节和字符流方法介绍

字节输入流InputStream和字符输入流Reader

InputStream和Reader是所有输入流的基类,他们都是2个抽象类,本身并不能创建实例来执行输入,但他们有输入流的模版,所以它们的方法是所有的输入流和输出流可以用的方法。

在InputStream里常用的方法:

  • int read(): 从输入流中读取单个字节
  • int read(byte[] b): 从输入流中读取最多b.length个字节,将读取的字节存在数组b中,返回实际读取的字节数
  • int read(byte[] b, int off, int len): 从输入流中读取最多len个字节数据,并将其存储在数字b中,放入b数组中时,并不是从数组起点开始,而是从off位置开始,返回实际读取字节数。

在Reader里经常使用的方法:

  • int read(): 从输入流中读取单个字符
  • int read(char[] c): 从输入流读取最多c.length个字符数据,并将其存储在字符数组c中,返回实际读取的字符
  • int read(char[] c, int off, int len): 从输入流中读取最多len个字符的数据,将读取的数据放到字符数组c中保存,从数组的off开始读取;
    InputStream、Reader还支持如下几个方法移动指针:
  • void mark(int readAheadLimit): 在记录指针当前位置第一个标记(mark)
  • boolean markSupported(): 判断此输入流是否支持mark()操作,即是否支持记录标记
  • void reset():将此流的记录的指针重新定位到上一次记录的标记的位置
  • long skip(long n):记录指针向前移动n个字节、字符

OutputStream字节输出流和Writer字符输出流

具有以下方法:

  • void write(int c): 指定的字节、字符输出到输出流中
  • void write(byte[]/char[] buf): 将字节数组/字符数组中的数据传输到指定输出流中
  • void write(byte[]/char[] buf, int off,int len):将指定数组中的数据输出到指定输出流中

byte[]是OutputStream的方法,char[]是Writer的方法

字符输出流还有以下方法:

  • void write(String s):将指定字符串输出到指定输出流中
  • void write(String s, int off, int len):将字节数组、字符数组中从off位置开始,长度为len的字节、字符输出到输出流中