随机读写文件类简介出自:https://blog.csdn.net/u013087513/article/details/51911577
如下图所示:java提供了RandomAccessFile随机读写文件类,大概从该类开始,可以更深入的展开学习操作系统、应用程序对磁盘的数据存取是如何操作的。
该类的提供的功能:
1、程序可以从txt文件的任意位置开始读取文件的任意长度内容
(1)位置、内容都是以字节个数来算的,比如从第20个字节处开始读,读取8个字节。
(2)txt中可以存储数字、英文字母、汉字。数字、英文字母占用一个字节,汉字占用两个字节(txt中存储:方3。若想只读出3,指针必须先跳两个字节,才能指向3)。
(3)我用200m的sql文件测试过,如论跳到文件的哪个位置开始读,速度都感觉一样快。(感觉这个指针就是磁盘的某个地址,所以速度快)
(4)mysql 数据库表,每个字段都有固定的字节长度,这大概就是为了方便指针定位。主键id就是这个指针。
有人说主键也是索引,存在主键索引的说法。索引一般占用额外的磁盘空间,但主键只存在于原始表中,不需要额外的空间。
其实说主键是索引也没问题,主键就是为了唯一确定一行数据用的。概念的东西不必纠结,知道主键、普通索引的原理就行。
mysql是用c++写的,在网上没搜到主键原理,可能原理就类似RandomAccessFile,主键就是指针。
(5)seek 是直接跳到文件的指定位置,与当前位置无关;
skipByte 是在当前位置的基础上再跳过指定字节数;
出自百度知道:
seek(long a)是定位文件指针在文件中的位置。参数a确定读写位置距离文件开头的字节个数,比如seek(0)就是定位文件指针在开始位置。是绝对定位。
skipBytes()是指在文件中跳过给定数量的字节。是相对定位。
对于seek方法,拥有skipBytes( )的功能,但seek( )在使用过程非常影响系统的开销。
磁盘中存取信息的最小单位是? 出自:https://blog.csdn.net/zk_j1994/article/details/72676862
1、从应用程序包括用户界面的角度来看,存取信息的最小单位是Byte(字节);
2、从磁盘的物理结构来看存取信息的最小单位是扇区,一个扇区是512字节;
3、从操作系统对硬盘的存取管理来看,存取信息的最小单位是簇,簇是一个逻辑概念,一个簇可以是2、4、8、16、32或64个连续的扇区。一个簇只能被一个文件占用,哪怕是只有1个字节的文件,在磁盘上存储时也要占用一个簇,这个簇里剩下的扇区是无用的。例如用NTFS文件系统格式化的时候默认是8个扇区组成一个簇,即4096字节。所以你如果保存了一个只有1字节的文件(例如字母N),它在磁盘上实际也要占用4096字节(4K),所以“簇”也可以理解为操作系统存取信息的最小单位。
文件的最小访问单位是4KB,数据库为一个1至多个文件最小访问单位
个人理解,程序、操作系统可以定位到磁盘任意一个字节的位置,有这个概念就可以了。