在上一章节中我们了解到Java I/O在进行数据传输的过程中,其传输的一端必定为数据资源,下面我们就来具体了解一下能够被Java I/O操作的常见的数据资源。
在Java I/O当中根据存储空间和功能可以将数据资源大致分为以下几类:
字节/字符数据是存在于程序内部的临时存储数据,这类数据会存储在应用程序的内存当中,一般用于程序运行时进行使用,而字节/字符数组则是其对应的存储空间。
在使用字节或者字符数组时需要注意,这里存储的数据应当保证是 纯文本的 、 与文件属性无关的 数据内容,如果数据内容存在依赖文件属性的情况,那么即时可以存储到字节/字符数组当中,当将数据还原的时候也会存在文件损坏或者乱码的情况。除此以外,由于是存储在内存当中的临时数据,当应用程序发生了故障中断或者重启时,这部分数据会发生丢失的情况。
在Java I/O当中通过使用 ByteArrayInputStream/CharArrayReader
和 ByteArrayOutputStream/CharArrayWriter
来对字节/字符数组进行读取或者写入操作。
文件可以说是除了字节/字符数组以外Java当中最常见的数据存储空间,是一种存储在磁盘当中的持久化数据,即时当你的应用程序发生故障中断或者重启,文件本身会依然存在。需要注意的是,和字节/字符数据相比,除了存储位置不同,文件还包含了文件数据本身的属性信息,并且不同类型的文件其存储时的数据结构还存在着较大差异。
为了方便Java I/O对于文件的操作,JDK在io类库当中提供了 File
和 FileDescriptor
两个类对文件进行抽象表示。这里可能有些同学要迷惑了,为什么一个概念要用两个不同的类的抽象表示,这不是增加学习成本吗?下面我们来具体分析一下这两个类。
从源码中可以看到,File类描述了一个文件/目录的基本情况,诸如文件路径、是否存在、是否为隐藏文件、是否可读、是否可写、列出当前目录下的文件、文件大小等信息。除了描述文件的基本信息,File类还提供了根据指定路径创建文件、删除文件、获取父文件、获取绝对路径等操作。可以看到这里提供的能力是将 文件属性信息 作为一个 对象 而进行的对应操作,并不涉及到文件内容的操作。
对操作系统熟悉的同学一定听过文件描述符这样一个概念,其实FileDescriptor类的功能和操作系统当中的文件描述符类似,只不过是在Java这个平台当中。FileDescriptor类实际上是用于表示一个指向已经被打开的文件的指针,当然,在Java当中应当描述为引用。需要注意的是,这里仅提供了充当底层机器特定结构的不透明句柄的作用,并没有File类的功能,也没有操作文件内容的能力。
从上面的分析我们可以找到一些关于Java中分为两个类去描述文件的思路,File类在进行文件处理时需要依赖文件路径,而FileDescriptor类的操作则与文件路径无关而与底层机器有关,只需要起到句柄作用即可,可以看到这里包含着 单一职责 的思想,前者处理了文件存在性和权限等问题,后者则实现了对于文件在底层机器中的定位问题。但是这两者都无法直接进行文件内容的操作,需要通过 FileInputStream/FileOutputStream
来进行文件的读写操作。
其实这又是一个来源于操作系统的概念,就如同管道在操作系统中提供进程间通信的能力一样,Java I/O中的管道提供了在 同一个JVM当中两个线程进行通信 的能力。需要注意,虽然功能看起来类似,但是后者提供的通信能力是针对 同一个进程 当中的两个线程,而非不同地址空间的两个进程。
网络资源实际上是存储在远程机器上的数据资源,其在远程机器上的存在形式可能是字符/字节数组,也可能是文件。要想访问网络资源,就需要通过网络连接进行通信。由于网络通信的复杂性和不确定性,导致在进行数据资源处理时,I/O模型不能简单的复用读取本地资源的I/O模型。在Java I/O类库当中并没有很好的给出对应的模型方案,而在后续的Java NIO中给出了解决方案。
简单来说就是通过外设向程序进行输入或者展示程序输出给外设的结果。在Java中有如下三个流提供系统输入/输出:
Systen.in
: 只有指向Java应用程序的键盘输入才能进行读取;Systen.out
Systen.err
: 将错误信息输出到控制台中(对,就是你平时在ide中看到的红色的堆栈信息);本章主要讲解了Java I/O中的操作对应——数据资源,也即所操作数据的来源和目的地。以上几种数据资源是根据io类库中的类进行的简单分类,并没有完全包含所有的类型,有兴趣的同学可以继续拓展研究一下。下一章我们将进行 流 这一概念的学习。
本文分享自 Brucebat的伪技术鱼塘 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!