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. Python头脑风暴3

    驾校是个暴利行业 如果有高学历靠谱的IT人员做驾校教练等等等等.... Python虽然难做企业级应用,但Python是全球个人自定义应用的首选!!!没有之一,所有语言最快的开发速度,最个性化的私人定 ...

  2. IAR生成bin,HEX文件

    1.生成bin,hex文件 options->output converter->output format binary:.bin文件:intel extended:hex文件. 生成的 ...

  3. 求数组中两两相加等于20的组合(Python实现)

    题目 求数组中两两相加等于20的组合. 例:给定一个数组[1, 7, 17, 2, 6, 3, 14],这个数组中满足条件的有两对:17+3=20, 6+14=20. 解析 分为两个步骤: 先采用堆排 ...

  4. TCP的三次握手和四次握手

    三次握手(建立连接) 首先,服务器进程(B)先创建传控制块TCB(用来存储连接信息,如连接表,发送和接收序号等),准备接收客户进程(A)的请求.然后服务器进程处于LISTEN(收听)状态,等待客户的连 ...

  5. hql的笔记

    删除方法 getSession().delete(arg0); 今天写这个删除语句的时候运用这delete()这个方法,根据id删除记录,hql和普通的sql还是有区别的, 普通的sql封装好了del ...

  6. Aizu 2450 Do use segment tree 树链剖分

    题意: 给出一棵\(n(1 \leq n \leq 200000)\)个节点的树,每个节点有一个权值. 然后有\(2\)种操作: \(1 \, a \, b \, c\):将路径\(a \to b\) ...

  7. socketserver源码剖析

    作者:人世间链接:https://www.jianshu.com/p/357e436936bf來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处 BaseServer 和 B ...

  8. ATM源码

    package atm;//张秋亮,信1705-3,20173529 public class Account { private String accountID; private String a ...

  9. 24、AES RSA加密处理记录

    一.加密过程解释 前提:发送方为A,接受方为B牢记:RSA为非对称加密,AES为对称加密.对称加密,属于传统的加密技术,加密和解密的秘钥都是相同的,AES的秘钥长度有128.192.256三种.非对称 ...

  10. [转载]ExtJs4 笔记(1) ExtJs大比拼JQuery:Dom文档操作

    出处:[Lipan] (http://www.cnblogs.com/lipan/) 现在主流的JS框架要数ExtJs和JQuery应用的比较广泛.JQuery属于轻量级的,一般做网站应用比较常见,可 ...