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、完成后重命名临时文件为源文件名。

较忙,以后再补源码。

Java RandomAccessFile类的更多相关文章

  1. java RandomAccessFile类(随机访问文件)

    该类可以实现对同一个文件的读写操作,与其他IO流不同的是可以指定读写指针的脚标(seek),有跳过指定个数字节(skipBytes)操作. 另外该类也可用于断点续传. 简单示例如下: import j ...

  2. [Java IO]01_File类和RandomAccessFile类

    File类 File类是java.io包中唯一对文件本身进行操作的类.它可以进行创建.删除文件等操作.   File类常用操作 (1)创建文件 可以使用 createNewFille() 创建一个新文 ...

  3. java基础知识回顾之javaIO类--RandomAccessFile类

    java.io 类 RandomAccessFile java.lang.Object java.io.RandomAccessFile1.该类不是IO流中的子类.2.该类既能读又能写.3.该对象内部 ...

  4. 【Java IO流】RandomAccessFile类的使用

    RandomAccessFile类的使用 RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. RandomAc ...

  5. Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)

    一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...

  6. Java基础 使用转换流进行文件的复制 / RandomAccessFile 类进行文件的复制

    笔记:  **使用转换流进行文件的复制 文本文件---字节流FileInputStream--> [InputStreamReader] -----字符流BufferedReader------ ...

  7. Java RandomAccessFile用法

    RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须 ...

  8. RandomAccessFile类

    File类只是针对文件本身进行操作,而如果要对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机地读取一个文件中指定位置的数据. //============ ...

  9. DataInputStream类和RandomAccessFile类的使用方法

    // DataInputStream类实现了DataInput接口,要想从文件中读入二进制数据, // 你需要将DataInputStream与某个字节源相结合,例如FileInputStream / ...

随机推荐

  1. servlet 作用

    什么是Servlet Servlet是一个Java编写的程序,此程序是基于Http协议的,在服务器端运行的(如tomcat),是按照Servlet规范编写的一个Java类. 在BS架构中,早期的Web ...

  2. 【转载】美国人教你这样用Google

    大前提:英文Google→www.google.com 第一篇 在搜索框上输入:“indexof/”inurl:lib 再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍. 在搜索框上输入:“i ...

  3. 由浅入深学习PBR的原理和实现

    目录 一. 前言 1.1 本文动机 1.2 PBR知识体系 1.3 本文内容及特点 二. 初阶:PBR基本认知和应用 2.1 PBR的基本介绍 2.1.1 PBR概念 2.1.2 与物理渲染的差别 2 ...

  4. 蓝桥杯Java输入输出相关

    转载自:http://blog.csdn.net/Chen_Tongsheng/article/details/53354169 一.注意点 1. 类名称必须采用public class Main方式 ...

  5. Could not load file or assembly 'AjaxControlToolkit' or one of its dependencies

    Could not load file or assembly 'AjaxControlToolkit' or one of its dependencies. API 调用退出异常. (Except ...

  6. day03_11 if语句实现猜年龄01

    老男孩猜年龄游戏 age_of_princal = 56 guess_age = int( input(">>:") ) #以下为伪代码 ''' if guess_ag ...

  7. selenium非常好的资料收集

    非常全的中文资料:http://qi-ling2006.iteye.com/ http://blog.csdn.net/qq744746842/article/details/49926917

  8. 使mysql的表内容可以输入中文内容

    修改数据库的字符集mysql>use mydb mysql>alter database mydb character set utf8;

  9. [git 学习篇]远程创库

    实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交. 完全 ...

  10. 换肤功能的实现以及监听storage实现多个标签页一起换肤

    1:需求:项目的侧边栏实现换肤功能,核心代码: updateSkin (val) { const existSkinLink = document.head.querySelector('link[i ...