RandomAccessFile

  RandomAccessFile 是随机访问文件的类。它支持对文件随机访问的读取和写入,即我们也可以从指定的位置读取/写入文件数据,因为该类在其内部封装了一个数组和指针,当要用该类的对象读取文件中的元素时,就将要读取的元素先存储在数组中,而get方法和set方法也就是读和写操作。
  需要注意的是,RandomAccessFile 虽然属于java.io包(因为它具备读和写的功能),但它不是InputStream或者OutputStream的子类; FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对文件进行写操作;但是,RandomAccessFile 同时支持文件的读和写,并且它支持随机访问,原理在于RandomAccessFile内部封装了FileInputStream和FileOutputStream。

  虽然RandomAccessFile 可以同时对文件进行读取和写入,但是它却有一个较大的局限性,那就是它只能操作文件,也就是说只能操作硬盘上的数据,而不能操作内存,控制台上的数据。

构造函数:

  

  

1. RandomAccessFile 模式说明

RandomAccessFile共有4种模式:"r", "rw", "rws"和"rwd"。

"r"    以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入。相对于 "rw","rws" 还要求对“文件的内容”或“元数据”的每个更新都同步写入到基础存储设备。
"rwd" 打开以便读取和写入,相对于 "rw","rwd" 还要求对“文件的内容”的每个更新都同步写入到基础存储设备。

说明

(01) 什么是“元数据”,即metadata?

  metadata是“关于数据的数据”。在文件系统中,数据被包含在文件和文件夹中;metadata信息包括:“数据是一个文件,一个目录还是一个链接”,“数据的创建时间(简称ctime)”,“最后一次修改时间(简称mtime)”,“数据拥有者”,“数据拥有群组”,“访问权限”等等。

(02) "rw", "rws", "rwd" 的区别。
当操作的文件是存储在本地的基础存储设备上时(如硬盘, NandFlash等),"rws" 或 "rwd", "rw" 才有区别。
当模式是 "rws" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]” 或 “修改文件元数据(如文件的mtime)”时,都会将这些改变同步到基础存储设备上。
当模式是 "rwd" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]”时,都会将这些改变同步到基础存储设备上。
当模式是 "rw" 并且 操作的是基础存储设备上的文件;那么,关闭文件时,会将“文件内容的修改”同步到基础存储设备上。至于,“更改文件内容”时,是否会立即同步,取决于系统底层实现。

注意:该对象在实例化时,如果要操作的文件不存在,不管是读操作还是写操作,都会自动创建文件;如果文件存在,写数据时未指定位置,会从头开始写,即覆盖原有的内容(注意只覆盖自己写入的位置)。可以用于多线程下载或多个线程同时写数据到文件。

  【代码演示】

 import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileWriteDemo {
public static void main(String[] args)throws IOException {
RandomAccessFile rafw=new RandomAccessFile("c:\\html\\test\\r.txt","rw");
//文件不存在,则自动创建,当文件存在时,会覆盖原有的文件,注意只是覆盖自己写入的部分。
rafw.write("sdfghjk".getBytes());//注意要进行写操作时,构造函数的mode必须设置为rw,否则报错:拒绝访问。
//rafw.writeInt(17);//注意write方法只写入最低八位,会造成数据丢失,因此选用writeInt方法
rafw.close();
RandomAccessFile rafr=new RandomAccessFile("c:\\html\\test\\r.txt","rw");
rafr.seek(3);//可以调节指针的位置,传入3,则表示从三号位置开始读取,默认指针是从0开始
byte[] buff=new byte[8];
int num;
while ((num=rafr.read(buff))!=-1){
System.out.print(new String(buff,0,num));
}
rafr.close();
}
}

  【代码演示】:往文件的指定位置插入内容,且不能覆盖原来的内容。

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner; public class insertData {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("请输入文件存放的路径:");
String path=in.nextLine();
System.out.println("请输入要插入的位置:");
Long points=in.nextLong();
in.nextLine();//缓冲回车键
System.out.println("请输入要插入的内容:");
String insertContent=in.nextLine();
try{
randomInserst(path,points,insertContent);
}catch (IOException e){
System.out.println("插入失败");
} }
public static void randomInserst(String path,Long points,String insertContent)throws IOException {
RandomAccessFile raf=new RandomAccessFile(path,"rw");
raf.seek(points);//调节指针位置
FileOutputStream fos=new FileOutputStream("c:\\html\\test\\tmp.txt");//临时文件
byte[] buff=new byte[12];
int num;
while ((num=raf.read(buff))!=-1){//将指针后面的内容先存储到临时文件中
fos.write(buff,0,num);//避免脏读
}
raf.seek(points);//因为指针会随着读取数据移动,最终到末尾,所以要重新调节指针位置
raf.writeBytes(insertContent);//将要写的内容插入
FileInputStream fis=new FileInputStream("c:\\html\\test\\tmp.txt");//读取临时文件
byte[] buff2=new byte[12];
int num2;
while ((num2=fis.read(buff2))!=-1){//将指针后面的内容先存储到临时文件中
raf.write(buff2,0,num2);
}
fis.close();
fos.close();
raf.close();
}
}

IO包中的RandomAccessFile类的更多相关文章

  1. 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

    ---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...

  2. Java基础---IO(三)--IO包中的其他类

    第一讲     对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ...

  3. IO包中的其他类

    查看各对象API文档 打印流 PrintWriter PrintStream 序列流:对多个流进行排列合并 SequenceInputStream public static void main(St ...

  4. Java笔记(二十八)……IO流下 IO包中其他常用类以及编码表问题

    PrintWriter打印流 Writer的子类,既可以接收字符流,也可以接收字节流,还可以接收文件名或者文件对象,非常方便 同时,还可以设置自动刷新以及保持原有格式写入各种文本类型的print方法 ...

  5. IO包中的其他类总结

    一.PrintStream和PrintWriter PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. PrintStream 打印的所有字符都使用平台的默认字符 ...

  6. IO 包中的其他类

    打印流 PrintWriter 和 PrintWriter 直接操作输入流和文件 序列流 SequenceInputStream 对多个输入流进行合并 操作对象 ObjectInputStream 和 ...

  7. Java之IO(十四)IO包中其它类

    转载请注明出处:http://www.cnblogs.com/lighten/p/7267553.html 1.前言 此章介绍IO包中剩余未介绍的几个流和工具类,包括LineNumberReader. ...

  8. java.io包中的字节流—— FilterInputStream和FilterOutputStream

    接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ...

  9. Java IO流中的File类学习总结

    一.File类概述 File类位于java.io包中,是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类有多种重载的构造方法.File类保存文件或目录的各种 ...

随机推荐

  1. mysql累加、累减

    累加 先上表结构: CREATE TABLE `abc` ( `jidu` ) NOT NULL AUTO_INCREMENT, `jine` ) DEFAULT NULL, PRIMARY KEY ...

  2. python 自定义expection

    class PricePolicyInvalid(Exception): def __init__(self, msg): self.msg = msg

  3. kafka 中 zookeeper 具体是做什么的?

    zookeeper 是 kafka 不可分割的一部分,可见其重要程度,所以我们有必要了解一下 zookeeper 在 kafka 中的具体工作内容. 而且,这也是面试时经常问的. zookeeper ...

  4. spring-cloud-gateway报错

    2019-08-13 09:41:19.216 WARN [-,,,] 10084 --- [ main] ConfigServletWebServerApplicationContext : Exc ...

  5. (树形DP)Strategic game POJ - 1463

    题意: 给你一棵树,树的每一个节点可以守护与其相连的所有边,问你最少用多少个节点可以守护这整棵树 思路: 仔细思考不难发现,要想守护一条边,边的两个端点必须有一个可以被选(两个都选也可以),然后这个问 ...

  6. linux ftp 服务器 ,web 服务器 配置

    ftp服务器配置: 1:vsftpd.conf 2;vsftpd.ftpusers 3:vsftpd.user_list web服务器配置: apache 配置

  7. mongoskin 是让 Node.js 支持 MongoDB 的内嵌访问层。

    mongoskin 是让 Node.js 支持 MongoDB 的内嵌访问层.

  8. 龙芯 Fedora 28 设置 VNC

    系统为龙芯版Fedora28 (床28) Fedora防火墙默认阻止了VNC所需的端口的访问,导致VNC客户端一直无法连接. 安装VNC Server sudo dnf install tigervn ...

  9. 强大的 Python 任务自动化工具!invoke 十分钟入门指南

    接着前面的<tox 教程>,以及刚翻译好的<nox文档>,我们继续聊聊 Python 任务自动化的话题. nox 的作者在去年的 Pycon US 上,做了一场题为<Br ...

  10. 大数据面试题(一)----HADOOP 面试题

    1. 下列哪项通常是集群的最主要瓶颈(C) A. CPU B. 网络 C. 磁盘IO D. 内存 2. 下列哪项可以作为集群的管理工具?(C) A.Puppet B.Pdsh C.ClouderaMa ...