RandomAccessFile类是Java中操作文件内容功能最强大的类,既可以读,也可以写。

RandomAccessFile支持随机访问,可以直接访问文件的任意位置,在文件的任意位置读写数据。如果要随机访问文件内容,RandomAccessFile是很好的选择。

Random,意为随机、任意,RandomAccessFile,即可访问文件的任意位置;RAM(Random Access  Memory),即可访问文件/数据任意位置的内存。

构造函数:

  • RandomAccessFile(String filePath, String mode)
  • RandomAccessFile(File  file, String mode)

mode是一个字符串,指定文件打开方式。可能的值:

  • “r”    只读,若文件不存在,会报错
  • “rw”    读写,若文件不存在,会自动创建。只要有write权限,文件不存在时都会自动创建。
  • “rwd”   读写,对文件内容的每个更新都会同步写到底层IO设备
  • “rws”    读写,对文件内容、元数据的每个更新,都会同步写入底层IO设备。

RandomAccessFile提供了多种读写数据的方法,能读写多种类型的数据,既能以字符方式进行读写,又能以字节方式进行读写。

RandomAccessFile提供了2个操作记录指针的方法,用于支持随机读写:

  • long  getFilePointer()    返回文件记录指针的当前位置
  • void  seek(long  position)    将文件指针跳转到指定位置

InputStream类、Reader类也提供了操作指针的方法,但操作的指针都是读指针,只能在输入流中使用。OutputStream类、Writer类不能操作指针。可以随机读,不能随机写。

RandomAccessFile操作的指针是读写指针,可以在读的时候操作指针,也可以在写的时候操作指针,可以随机读写。

说明:

  • RandomAccessFile只能操作文件内容(读写),不能对文件本身进行操作(修改文件名、删除等),也不能访问文件的其他信息,比如最后修改时间,但可以访问文件大小(内容长度)。
  • RandomAccessFile,这里的File只指文件,不包括文件夹,即只能操作文件。
  • RandomAccessFile不能在指定位置插入内容,指针跳转到指定位置,写入内容,会覆盖原有的内容,并不是插入。要实现插入,需要借助一个中间容器,可以将后面的内容读到一个大的byte[]中,或者新建一个临时文件来保存,指针跳转到指定位置开始写,然后再把byte[]或者临时文件中的内容写入。

使用RandomAccessFile实现多线程断点传输、下载(比如迅雷):

1、开始时建立2个文件,通过File类的静态方法createTempFile()创建一个同等大小的空的临时文件,再创建一个文本文件用于记录每个文件指针的位置

2、启动多个线程,每个线程只负责一小节内容的下载。每个线程使用一个单独的byte[]、网络输入流对象、RandomAccessFile对象(向临时文件中写入数据,要随机写)、文件指针(网络输入流对象、RandomAccessFile对象使用的文件指针位置是相同的),使用循环从网络中读取数据,存储在byte[]中,将byte[]中的数据写入到临时文件中。

3、由于用户点击暂停、网络中断、退出程序等原因导致下载中断时,要将每个线程的文件指针位置保存到文本文件中,继续下载时先从文本文件中读取每个线程的指针位置,将每个线程的文件指针位置设置为对应的值(网络输入流对象、RandomAccessFile对象都要设置),然后启动多线程继续下载。

4、完成后重命名临时文件为源文件名。

较忙,以后再补源码。

最新文章

  1. JS总结 本地对象1
  2. cs端调用Ajax
  3. 删除Android包
  4. ubuntu编译运行xv6
  5. Android之Fragment(一)
  6. js写个日历
  7. Postgresql命令行和数据库备份与恢复
  8. cookie 编码问题
  9. Educational Codeforces Round 5 A
  10. leetcode面试准备:Contains Duplicate I && II
  11. Vue.js + Seajs 实例(包含vue-router使用)
  12. java I/O---复制文本文件
  13. 使用python读取word,写入execl
  14. Java动态代理实现及实际应用
  15. 【leet-code】712. 两个字符串的最小ASCII删除和
  16. JXOI2018简要题解
  17. 15.Mysql中的安全问题
  18. uitableview 和UISearchBar 下拉提示结合使用
  19. Javascript--普通函数调用-涨工资计算函数
  20. Java编程性能优化一些事儿【转】

热门文章

  1. java web项目(spring项目)中集成webservice ,实现对外开放接口
  2. Linux入门学习笔记2:终端命令
  3. Aizu - 1386 Starting a Scenic Railroad Service (思维乱搞)
  4. python for data analysis chapter1~2
  5. HDU 5528 Count a * b 欧拉函数
  6. luogu3381 【模板】最小费用最大流
  7. webdriver高级应用- 使用Chrome浏览器自动将文件下载到指定路径
  8. Selenium WebDriver- 操作浏览器的cookie
  9. django html render_to_response
  10. [转]如何把嵌套的python list转成一个一维的python list?