JAVA IO流
首先我们来讲一下什么是流,IO流也就是输入输出流,流在程序中可以理解为数据的流动,比如从文件中读取数据到程序中来就是文件输入流,将数据写到文件中去就是文件输出流,输入和输出是以程序为参照物,将数据读取到程序中来就是输入流,将数据从程序中写出就是输出流。
我们来看一张图对IO流有个总体的认识
大家也不要被这张图给吓到了,IO流的确包含的内容很多,但其实都大同小异,我们只要掌握最前面的四个抽象类(InputStream,OutputStream,Reader,Writer),我们就能对IO流有基本的认识,因为其他流都是继承者四个抽象类的,因此他们的很多方法其实都是相同的。
IO流的分类
一、按照流向可以分为输入流和输出流
二、按照读取和写出的单位来分,我们可以将其分为字节流和字符流,字节流也就是InputStream和OutputStream以及继承了它们两个的所有子类,字符流也就是Reader和Writer以及继承了这两个的所有子类。顾名思义,字节流也就是以字节为单位进行读取和写出,字符流也就是以字符为单位进行读取和写出。如果我们操作的对象是图片音乐或者视频等,我们要采用字节流,因为这些对象的本质都是数字,因此使用字节流进行读取会更高效和方便,而使用字符流就可能会读取出错。对于文本类的对象,就应该采用字符流,因为使用字节流读进来的文本我们要查看的话也要将其转换为字符,所以直接用字符流读取会更方便,而且如果有中文的话我们就必须要使用字符流进行读取,因为使用字节流会造成乱码。这是因为中文一个汉字占的是两个字节,英语一个字母占的是一个字节,我们使用字节流读取的使用是一个一个字节的读的,因此在读取汉字时,我们会将汉字的字节拆开读取,读进来后我们转为字符时就会导致乱码。
三、按照其实现功能可以分为节点流和处理流。节点流,也就是其数据流读入的起点和写出的终点都是实际的对象,比如文件输入输出流是直接从文件中进行读取和写出。由于节点流每次都要到硬盘上的文件中进行操作,效率就会比较低,速度会比较慢。因此,为了提高性能,就有了处理流,处理流是依托于节点流的,处理流读取的起点和写入的终点都是节点流,是直接在流中进行操作,然后在处理完毕后由节点流再统一对文件或其他对象进行操作,因此效率会更高。从代码层面来理解节点流和处理流就比较简单了,我们可以去查看它们的构造方法,我们在new一个IO对象的时候,如果需要我们传入的是一个文件对象或者文件目录或者是其他的句柄,那么这就是节点流,而如果需要我们传入的是一个节点流对象,那么就是处理流。
IO流的基本操作步骤
1、创建源
2、选择流
3、操作
4、释放资源
这里我以文件字节输入流(FileInputStream)为例
import java.io.*;
public class IO {
public static void main(String[] args) throws IOException{
//1.创建源
File file = new File("test.txt");
//2.选择流
FileInputStream input = new FileInputStream(file);
//3.操作,从文件中每次读取一个字节,依次转换成字符后打印,直到read()方法返回-1表示文件读完为止。
int c;
while((c=input.read())!=-1) {
System.out.print((char)c);
}
//4.释放资源
input.close();
}
}
这里主要是让大家了解IO流的基本思想,至于它们的各种方法建议大家直接阅读源码或者阅读API会更加方便与详细,其方法众多,我们重点掌握read(),write(),flush(),close(),readLine()这几个方法,至于其他方法,当我们需要的时候可以在进行学习,因为一次既是学了太多的方法,如果我们用不上的话也会忘记,当我们遇到的时候我们就可以通过查API或者读源码的方式了解其用法和作用。