IO包中的RandomAccessFile类
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类的更多相关文章
- 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类
---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...
- Java基础---IO(三)--IO包中的其他类
第一讲 对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ...
- IO包中的其他类
查看各对象API文档 打印流 PrintWriter PrintStream 序列流:对多个流进行排列合并 SequenceInputStream public static void main(St ...
- Java笔记(二十八)……IO流下 IO包中其他常用类以及编码表问题
PrintWriter打印流 Writer的子类,既可以接收字符流,也可以接收字节流,还可以接收文件名或者文件对象,非常方便 同时,还可以设置自动刷新以及保持原有格式写入各种文本类型的print方法 ...
- IO包中的其他类总结
一.PrintStream和PrintWriter PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. PrintStream 打印的所有字符都使用平台的默认字符 ...
- IO 包中的其他类
打印流 PrintWriter 和 PrintWriter 直接操作输入流和文件 序列流 SequenceInputStream 对多个输入流进行合并 操作对象 ObjectInputStream 和 ...
- Java之IO(十四)IO包中其它类
转载请注明出处:http://www.cnblogs.com/lighten/p/7267553.html 1.前言 此章介绍IO包中剩余未介绍的几个流和工具类,包括LineNumberReader. ...
- java.io包中的字节流—— FilterInputStream和FilterOutputStream
接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ...
- Java IO流中的File类学习总结
一.File类概述 File类位于java.io包中,是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类有多种重载的构造方法.File类保存文件或目录的各种 ...
随机推荐
- Windows10内嵌Ubuntu子系统配置python开发环境
Windows10内嵌Ubuntu子系统配置python开发环境 安装pycharm. 到intellij idea网站下载Linux环境下载免费的pycharm,通过ubuntu子系统内部的/mnt ...
- 2019CSP复赛游记
Day 0 作为一个初三的小蒟蒻…… 什么算法都不会打…… 做一道LCA+生成树的图论题调了两个小时…… 明日裸考…… Day 1 Morning 买了两个士力架,带了一盒牛奶,准备在考场上食用(这个 ...
- 2.Scanner的进阶使用
package com.duan.scanner; import java.util.Scanner; public class Demo04 { public static void main(St ...
- python3小脚本-监控服务器性能并插入mysql数据库
操作系统: centos版本 7.4 防火墙 关闭 selinux 关闭 python版本 3.6 mysql版本 5.7 #操作系统性能脚本 [root@localhost sql]# cat cp ...
- 在动作方法中生成输出URL (Generating Outgoing URLs in Action Methods) |
- C语言寒假大作战01
问题 回答 这个作业属于哪个课程 2019软件四班C语言寒假作业大作战 这个作业要求在哪里 作业要求 我在这个课程的目标是 gitee 与 git基础命令学习与使用 这个作业在那个具体方面帮助我实现目 ...
- [校内训练19_09_10]sort
题意 给一个非负整数序列,每次问能否异或上一个正整数使得所有的数单调不减.如果能,输出最小的x,否则输出-1.单点修改.多测.要求最多一个log. 思考 只要考虑相邻的两个数.找到这两个数最高的不同的 ...
- LeetCode题目总结-滑窗法
LeetCode题目总结-滑动窗口法 滑动窗口法:此方法首先建立一个长度为零的窗口,把右侧窗口向右移动,当新的元素与原来窗口中的元素不重复时,把新的元素加入其中,并更新窗口长度:当新的元素与原集合中的 ...
- IDEA debug下取消后续操作
有时进行测试时,不想后面的代码执行 具体应该怎么请看下文: 测试代码 public class demo { public static void main(String[] args) { Syst ...
- 每天一道Java题[9]
题目 native关键字的作用是什么? 解答 首先,需了解JNI(Java Native Interface),它是连接Java平台与本地C代码的一个API. 其次,用native关键字声明的方法,是 ...