Java中的IO流提供了很多的操作类,主要的一些如下图所示:
首先关于其中的这些操作类做一个简单的总结:
在java中的流操作主要分为字节流和字符流;字节流和字符流都对应着有两个基类,其他的具体的操作类都是继承与它们。
字节流
- Inputstream(输入字节流)
- Outputstream(输出字节流)
字符流
- Reader(输入字符流)
- Writer(输出字符流)
其中字节流是指数据流中的最小的数据单元是字节,字符流是指数据流中的最小数据单元是字符,需要注意的是在Java中字符
采用的是Unicode编码,因此一个字符不管是汉字还是字母均是占2个字节;
为什么要使用字符流
因为使用字节流操作汉字或特殊符号语言的时候容易乱码,因为汉字不止一个字节,为了解决这个问题,建议使用字符流;一般
针对文本文件操作时使用字符流,而对于一些二进制文件,比如图片,音视频则需要采用字节流。
字节流操作
基类是Inputstream和Outputstream。
- 输入流对应的方法
int read():读取一个字节,返回读取的字节
read(byte[] b):读取多个字节,并保存到数组 b 中,从数组 b 的索引为 0 的位置开始存储,返回读取了几个字节
int read(byte[] b,int off,int len):读取多个字节,并存储到数组 b 中,从数组b 的索引为 0 的位置开始,长度为len个字节
读取之后需要进行相应的转化,比如转换为对应的字符串new String(b);
- 输出流对应的方法
void write(int b):把一个字节写入到文件中
void write(byte[] b):把数组b 中的所有字节写入到文件中
void write(byte[] b,int off,int len):把数组b 中的从 off 索引开始的 len 个字节写入到文件中
在具体操作的时候可能首先需要将要输出的内容转换为对应的字节数,比如使用getBytes()方法。
字符流操作
基类是Reader和Writer。
- 输入流对应的方法
int read():每次读取一个字符,读到最后返回 -1
int read(char[] buffer):将字符读进字符数组,返回结果为读取的字符数
int read(char[] buffer,int off,int len):将读取的字符存储进字符数组 buffer,返回结果为读取的字符数,从索引 off 开始,长度为 len
- 输出流对应的方法
void write(int c):向外写出一个字符
void write(char[] buffer):向外写出多个字符 buffer
void write(char[] buffer,int off,int len):把 buffer 数组中从索引 off 开始到 len个长度的数据写出去
void write(String str):向外写出一个字符串
缓冲流
缓冲流具有缓冲的作用,可以加快读取和写入的速度,主要的操作类是前缀带buffer的类,依然是分为字节缓冲流和字符缓冲流;
在对文本文件操作时,一般可以使用缓冲流,方便使用readline方法来读取文本中的一行;