从前面所有的“跟我学IO”系列讲解中,了解了Java IO包中大部分类的使用。IO即输入输出操作,这里的输入指从磁盘加载数据到内存中,输出值将内存中的数据写入到磁盘或者网络中。Java IO按照读取数据的大小分为:
【字节流】字节流又分为:输入字节流(InputStream)和输出字节流(OutputStream)
【字符流】字符流又分为:输入字符流(Reader)和输出字符流(Writer)
注意:字节流每次只能操作一个字节;字符流每次只能操作一个字符。即使使用Java IO包装类BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter类也是如此。
上图是原始IO类操作流程(没有经过封装的IO流操作图,如:FileInputStream/FileOutputStream类),每次从文件中读取一个字节/字符或者每次写一个字节/字符到文件中去。这样每次只能读取/写入一个字节/字符将严重影响IO效率,因此就出现了在未经封装IO上面扩展出来的高级IO操作类,如:BufferedInputStream/BufferedOutputStream类,这些类中间存在一个字节/字符数组(缓存区)。如下图:
上图多出了一个缓冲区模块,这就可以大大提高IO的效率。不必客户端每次都一次一次的请求底层API接口,则是批量的请求底层API。
Java IO类的层次如下图所示:
字节输入流的类层次图:
InputStream接口定义了输入字符流操作规范。FileInputStream是输入字符流的最基本操作,BufferedInputStream是在FileInputStream类的基础上封装了更多高级的操作,DataInputStream可以将DataOutputStream写出的java基本数据读取到内存中来,ObjectInputStream是将ObjectOuputStream写出的对象读取到内存中来(反序列化)。
字节输出流的类层次图:
OutputStream接口定义了输出字节流操作规范,其中ileOutputStream提供了IO操作基本功能,属于原始流操作,BufferedOutputStream是对FileOutputStream的封装,提供了更多高级功能。DateOutputStream类提供了将java基本数据类型输出到文件的功能,ObjectOutputStream提供了将实现了Serializable接口的类写出到文件中(序列化)。
字符输入流类层次图:
Reader接口定义了输入字符流的操作规范,其中BufferedReader提供了更多高级的功能,如每次读取一行数据,LineNumberReader类提供了获取数据行号的功能等。
字符输出流类层次图:
Writer接口定义了输出字符流的操作规范,其中BufferedWriter提供了更多高级的功能,如每次写出一个字符输出,字符串等
如果上面这些IO类你都弄明白了,你IO这个包就学的差不多了,但是下一步还需要你继续学习NIO。