首页 > 其他分享 >第十二章《文件与I/O流》第2节:流的概念与分类

第十二章《文件与I/O流》第2节:流的概念与分类

时间:2023-01-02 14:33:22浏览次数:54  
标签:文件 字节 输出 数据源 分类 第十二章 单元 数据 输入

​12.1小节所介绍的File类只能获取文件的各种属性,并不能读取到文件的内容,更不能向文件中写入数据,如果希望读取或修改文件,就必须用“流”来完成。实际上,流不仅仅能够读写文件,还可以读取网络信息以及向网络发送信息。

“流”严格来说应该叫做“IO流”,其中字母“I”是Input这个单词的缩写,表示输入,而字母“O”是Output这个单词的缩写,表示输出。Java的IO流是实现输入和输出的基础,它可以方便地实现数据的输入和输出操作,因此,流就是指能够完成数据输入输出的类。Java语言中的流能够以相同的方式完成对不同数据源的输入输出操作。传统类型的流都被放在java.io包中,用以实现输入输出功能。​

12.2.1 流的分类

流可以从不同角度进行分类。如果按照数据的流向可以分为输入流和输出流,按照流每次处理数据的单位又可以把流分为字节流和字符流,而按照流的角色又可以把流分为节点流和处理流。​

用于读取数据的流称为输入流,而用于输出数据的流称为输出流。本书很多案例都会把程序运行结果输出到控制台上,这个操作就是用输出流完成的。每次把数据输出到控制台时,都是使用System类的out静态属性完成的,这个out属性实质上就是一个输出流,而System类的静态属性in则是一个输入流。需要注意:输入或输出的操作都是以程序作为参照物的。如果程序中产生的数据流向数据源,这个动作被称为“输出”,而数据源中的数据流向程序,则这个动作被称为“输入”,因此要以程序而不是数据源为参照物讨论数据流动的方向。Java的输入流主要由 InputStream和Reader作为父类,而输出流则主要由OutputStream和 Writer作为父类,它们都是一些抽象类,无法直接创建实例。​

字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同:字节流操作的数据单元是字节,而字符流操作的数据单元是字符。字节流主要由InputStream和OutputStream作为父类,而字符流则主要由Reader和Writer作为父类。​

从角色的角度来讲可以把流分为节点流和处理流。可以直接连接到数据源并进行读写操作的流称为节点流,而对节点流进行包装并提供更多功能的流称为处理流。处理流不能直接连接到数据源,但它能够提供更高效的读写数据方式。使用处理流的好处是:只要使用相同的处理流,程序就可以采用完全相同的输入或输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应地发生变化。​

12.2.2 流的工作原理

Java语言的流一共包括40多个类,虽然类的数量很多,但这些类工作的原理都是相同的。所有的输入流都用于读取数据,它们的工作原理如图12-4所示。​

第十二章《文件与I/O流》第2节:流的概念与分类_流

图12-4输入流的工作原理​

图12-4中的箭头表示指针,指针指向数据源中一个单元的数据。初始状态下,指针会指向数据源中的第一个数据单元。输入流每次读取数据时都只读取指针所指向的那个单元的数据。当读取完一个单元的数据后,指针会自动向后移动指向下一个单元的数据,当读取到最后一个数据单元后,指针会移动到数据源之外,这样输入流再次读取数据时就无法读出数据。通常情况下,输入流的读数据方法会返回-1来表示已无数据可读。对于字节类型的输入流而言,每个数据单元就是一个字节,而对于字符类型的输入流而言,每个数据单元就是一个字符。​

输出流的工作原理与输入流类似,但它是把数据输出到数据源,输出流的工作原理如图12-5所示。​

第十二章《文件与I/O流》第2节:流的概念与分类_输出流_02

图12-5输出流工作原理​

图12-5中的箭头也是指针,它指向一个数据单元,输出流每次进行输出操作时都会把一个单元的数据输出到指针所指向的存储空间中。图中深色的格子表示已经写入数据的单元,而浅色的格子表示还没有写入数据的单元。每当把一个单元的数据写入数据源后,指针也会自动向后移动,这样下一次输出操作就会把数据输出到相邻的空白存储空间。只要数据源的空间足够大,把数据全部输出完毕才是输出操作的结束。字节类型的输出流每次输出一个字节,而字符类型的输出流每次输出一个字符。

本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。

标签:文件,字节,输出,数据源,分类,第十二章,单元,数据,输入
From: https://blog.51cto.com/mugexuetang/5983691

相关文章