最近写代码时,写到很多和IO相关的东西,由于每次写的时候都是编翻书边学,顺便在网上找点现成的就直接用了。所以每次要写的时候都要废点周折,甚至写完了之后对于IO还不是很清楚。所以决定把java IO这部分好好复习下。
这一篇就写点刚看的IO基础东西吧。
java的API文档里,对java.io包的描述是:Provides for system input and output through data streams, serialization and the file system.
那么就先说下什么是“流”:流是java内存中的一组有序数据序列。java将数据从源(文件、内存、键盘、网络等)读入到内存中,形成流。然后还可以将这些流写入到另外的目的地(同样是文件、内存、控制台、网络等)。所以说,java的IO操作都是基于流来完成的。
流可以分为输入流/输出流、字节流/字符流,这些比较简单,就不多说了。另外,按照功能的不同,还可以分为节点流/处理流:节点流是指从一个源直接读写数据的流(这个流没有经过装饰),比如FileInputStream就是一个直接从文件读取字节的流,这就是一个节点流;处理流可以对节点流进行封装,比如BufferedInputStream就可以对FileInputStream进行封装,然后就具有了缓冲功能。
举个例子,比如我们要从文件中读取数据,可以用FileInputStream这么写
FileInputStream fis = new FileInputStream("text.txt");
但是直接这样读取,只能一个字节一个字节的读,如果想给这个输入流加个缓冲,将数据先全部放入到缓冲区中,可以这么写:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("text.txt"));
甚至可以给这一层再加上一个封装
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("text.txt")));
DataInputStream可以用来读取java原生的数据(具体是啥也不清楚,等下一片再讲)。
所有使用处理流封装节点流的功能都使用了decorator设计模式(其实java.io就是使用decorator模式组织的),decorator模式的目的是在不改变任何原有的类的基础上,添加新的功能。具体Decorator设计模式是什么样子的,接下来的篇幅会详细的讲解。
今天就这样,梳理下基本概念,接下来会针对java.io的重要类进行梳理,并提供一些例子。