先说概念:
Java API中,可以从其中读入一个字节序列的对象叫做输入流,可以向其中写入一个字节序列的对象叫做输出流。这些字节序列的来源地 和 目的地 可以文件、网络连接甚至内存块。抽象类InputStrean和OutputStream构成了I/O类层次结构的基础。
在java IO中总有好多的类,让人不知道该怎么使用。其实这样一种复杂的机制是为了让我我们的使用更加灵活。我们可以这样来理解java中的各种IO类:读写的基本单位是字节,InputStream和OutputStream可以读写单个字节或者字节数组,但要是想要读写字符串或者数字等,就需要功能更加强大的子类,如DataInputStream、DataOutputStream,可以以二进制格式读写所有的基本java类型。
java流类家族中有两类,一种流可以从文件中获取数据,一种流可以读入数值类型:某些输入流(如FileInputStream)可以从文件获取字节,而其他的输入流(如DataInputStream)可以把自己组装到更有用的 数据类型中。在使用中,通常对二者进行结合,例如,要从文件中读入数字,需要创建FileInputStream类对象,将其传递给DataInputStream的构造器。这样的情况下,输入流默认是不被缓冲区缓存的,即每调用一次read方法,都会请求操作系统再分发一个字节。这时候请求一个数据块,然后放置在缓冲区中会显得更加高效。这时候,就需要用到缓冲流,BufferedInputStream。上面的需求中,要把FileInputStream对象传入BufferedInputStream构造器,在把生成的对象传入DataInputStream。把DataInputStream放到构造器链的最后,是为了使用其提供的方法。
有时候我们有这样的需求:读入输入的时候,需要预览下一个字节。(待补充……)
java 读写文件的几种方式,这篇文章总结得很好,强烈推荐:
https://www.cnblogs.com/ll409546297/p/7197911.html
例如,在一次实践中我使用的是其中BufferReader嵌套InputStreamReader嵌套FileInputStream的方式,因为我需要按行读取文件内容,最外层的bufferedReader正好提供了这样的方法。关于这三个类的区别,在https://blog.csdn.net/qq_34569497/article/details/80476042这篇文章中有介绍。大意就是,inputstream读出来的是字节,inputstreamreader读出来的是字符,bufferreader是一下子读了一个数据块进行缓存,减少磁盘交互。
关于jave I/O,根据输入输出对象的不同,分为文本IO、二进制IO、对象IO。(待补充)