先了解下文件系统
Linux 使用的是ext4文件系统,会把分区主要分为两大部分(暂时不提超级块):一小部分用于保存文件的inode(i节点)信息;剩余的大部分用于保存block信息。
inode的默认大小为128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的block编号。
每个文件需要占用一个inode。大家如果仔细查看,就会发现inode中是不记录文件名的,那是因为文件名记录在文件所在目录的block中。
block的大小可以是1KB、2KB、4KB,默认为4KB。block用于实际的数据存储,如果一个block放不下数据,则可以占用多个block。例如,有一个10KB的文件需要存储,则会占用3个block,虽然最后一个block不能占满,但也不能再放入其他文件的数据。这3个block有可能是连续的,也有可能是分散的。
小结:
A 目录,B 目录,C 文件(Linux 没有目录的概念,他认为一切都是文件,但我们为了区分,就叫目录和文件了)A 目录中有B 目录和C文件。
A 的文件信息在 A inode中,A 的文件内容在 A block 中。这个A block 中有什么呢,他可是目录,他会有B 目录的 B inode 信息,有 C文件的 C inode 信息,至于B 目录的内容和 C 文件的内容都在他们各自的 block 中。
IO 流
由于以上原因,所以对文件的增加,删除,移动都是在他的 inode 所在的那个 block 中操作。而对文件内容的修改在自己的 block 中操作。
所以 linux 中 有专门的 vi、vim 命令操作文件内容。
而 java 中对文件内容的操作则是通过 输入、输出流。
以上输入源输出源是文件。
Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入/输出源。
stream是从起源(source)到接收(sink)的有序数据。
Java把所有传统的流类型(类或抽象类)都放在java.io包中,用以实现输入/输出功能。
提示: 因为Java提供了这种IO流的抽象,所以开发者可以使用一致的IO代码去读写不同的IO流节点。
思考
现实生活中的车流,水流 都是流,建立一个管道,从一个存储区沿着管道转到另一个存储区。