【0】README

0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——RandomAccessFile类解析 的相关知识;
0.1) 本文 转自: http://blog.csdn.net/akon_vm/article/details/7429245 , for complete my diy code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/BinaryIO.java


【1】RandomAccessFile类

1.1) RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。
1.2)RandomAccessFile不属于InputStream和OutputStream类系的。 (干货——RandomAccessFile同InputStream和OutputStream类一样,都继承实现了DataInput和DataOutput接口,但RandomAccessFile类和后两者之间没有什么关系 )

  • 实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。

1.3)基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法。

  • 比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。(干货——RandomAccessFile不支持只写文件,但支持r和rw访问模式)

1.4)只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。

  • BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。 (干货——RandomAccessFile类的seek 的作用等同于与 BufferedInputStream类的mark 方法和 reset方法结合)

1.5)RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的”内存映射文件(memory-mapped files)”给取代了。

  • 你该考虑一下是不是用”内存映射文件”来代替RandomAccessFile了。(干货——RandomAccessFile的绝大多数功能被nio的”内存映射文件(memory-mapped files)”给取代了,考虑使用内存映射文件来代替 RandomAccessFile)

【2】 内存映射文件

2.1)内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件。 (干货——内存映射文件的作用)

  • 有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问。这种解决办法能大大简化修改文件的代码。
    fileChannel.map(FileChannel.MapMode mode, long position, long size)将此通道的文件区域直接映射到内存中。
  • Attention)注意,你必须指明,它是从文件的哪个位置开始映射的,映射的范围又有多大;也就是说,它还可以映射一个大文件的某个小片断。

2.2)MappedByteBuffer是ByteBuffer的子类:因此它具备了ByteBuffer的所有方法,但新添了force()将缓冲区的内容强制刷新到存储设备中去、load()将存储设备中的数据加载到内存中、isLoaded()位置内存中的数据是否与存储设置上同步。这里只简单地演示了一下put()和get()方法,除此之外,你还可以使用asCharBuffer( )之类的方法得到相应基本类型数据的缓冲视图后,可以方便的读写基本类型数据。

2.3)尽管映射写似乎要用到FileOutputStream,但是映射文件中的所有输出 必须使用RandomAccessFile。

  • 但如果只需要读时可以使用FileInputStream,写映射文件时一定要使用随机访问文件,可能写时要读的原因吧。(干货——只需要读时可以使用FileInputStream,写映射文件时一定要使用随机访问文件)

2.4)该程序创建了一个128Mb的文件,如果一次性读到内存可能导致内存溢出,但这里访问好像只是一瞬间的事,这是因为,真正调入内存的只是其中的一小部分,其余部分则被放在交换文件上。这样你就可以很方便地修改超大型的文件了(最大可以到2 GB)。

  • Attention)注意,Java是调用操作系统的”文件映射机制”来提升性能的。

【3】看荔枝

  • Attention) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/RandomAccessFileDemo.java

3.1)RandomAccessFile类的应用:

3.2)RandomAccessFile 插入写示例:

3.3)利用RandomAccessFile实现文件的多线程下载:

  • 即多线程下载一个文件时,将文件分成几块,每块用不同的线程进行下载。下面是一个利用多线程在写文件时的例子,其中预先分配文件所需要的空间,然后在所分配的空间中进行分块,然后写入:

RandomAccessFile类解析相关推荐

  1. 通过扩展RandomAccessFile类使之具备Buffer改善I/O性能--转载

    主体: 目前最流行的J2SDK版本是1.3系列.使用该版本的开发人员需文件随机存取,就得使用RandomAccessFile类.其I/O性能较之其它常用开发语言的同类性能差距甚远,严重影响程序的运行效 ...

  2. 1.5 RandomAccessFile类:动态读取文件内容

    所谓动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾.动态读取需要用到 Java 中的 RandomAccessFile 类. RandomAccessFile 是 J ...

  3. 使用randomaccessfile类将一个文本文件中的内容逆序输出_Java IO2:RandomAccessFile

    RandomAccessFile RandomAccessFile类可以说是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法.RandomAccessFile类支持"随机访 ...

  4. 使用randomaccessfile类将一个文本文件中的内容逆序输出_Java 中比较常用的知识点:I/O 总结...

    Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列. 数据流是一串连续不断的数据的集合,就象水 ...

  5. @param注解的用法解析_SpringBoot 配置类解析

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/NvPO5-FWLiOlrsOf4wLaJA 作者:Li Wanghong SpringBoot ...

  6. RandomAccessFile类的简单介绍,以及代码演示

    RandomAccessFile类,支持对文件的读取和写入.并且可以设置写入和读取的位置.该位置主要是以字节体现.相当于该文件存储在一个大型byte[] 数组.隐含存在一个指向该数组的指针.类似于该类 ...

  7. Android开发--使用实体类解析JSON文本

    Android开发–使用实体类解析JSON文本 在Android开发过程中,涉及到了API的调用的时候,会返回特定的数据,两个主流返回的数据格式是JSON形式和XML形式.但是相对于XML,JSON数 ...

  8. Java String、StringBuffer、StringBuilder类解析

    String.StringBuffer.StringBuilder类解析 概述 String类:代表字符串. 特点 String实现了Serializable接口,表示String是可序列化的 实现了 ...

  9. Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略)

    Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略) 注:本文为旧文的markdown重制版 Cloudsim中VM调度策略类在DataCenter(或PowerDataCenter) ...

最新文章

  1. 一步一步学Silverlight 2系列(34):使用Silverlight Streaming托管Silverlight应用程序_转载...
  2. 022_Table表格
  3. 事物 @Transactional
  4. linux之一些比较新但是常用的命令(expr ag tree cloc stat tmux axel)
  5. python正则匹配ip_[求助] 正则表达式匹配 IP 地址的问题求助
  6. 逛画展(单调队列) acm寒假集训日记22/1/1
  7. CVPR2019目标分割论文推荐(附论文及代码链接)
  8. 箭头函数写法_箭头函数
  9. bochs运行xp_bochs安卓最新版下载
  10. 电音插件auto_Antares 发布新型人声制作插件 Auto-Tune EFX +
  11. 迭代算法与递归算法的概念及区别
  12. CVTE2019春招校招笔试、面试经验(硬件测试岗)
  13. 1260Completed String
  14. PyCharm使用技巧:windows下快捷键Ctrl+Alt+左箭头(后退)和Ctrl+Alt+右箭头(前进)冲突问题
  15. python画钢铁侠标志图片_python可视化之matplotlib绘图--蜘蛛侠钢铁侠(组合分区绘图)...
  16. Boost:shared_memory_object --- 共享内存
  17. 手把手教你使用stata制作临床决策曲线
  18. die、exit()和return区别
  19. JAVA通过Hutool解析CSV文件【导入即用,无需封装】
  20. 我们终将泄露的人脸数据,后果到底有多可怕?

热门文章

  1. Codeforces Round #741 (Div. 2)
  2. House Building HDU - 5538
  3. 牛客网 【每日一题】5月21日题目 图的遍历
  4. P4310-绝世好题【位运算,dp】
  5. 秀姿势(jzoj 3464)
  6. 25、jdbc操作数据库(2)
  7. Java中几种常量池的区分
  8. 组合模式的安全模式与透明模式
  9. 什么是AES算法?(整合版)
  10. 【最全最详细】publiccms常用的代码片段