1. RandomAccessFile
RandomAccessFile(radom随机access访问file文件),不是IO体系中的子类
随机访问文件,具备读写的功能。
一般多线程下载、断点下载都可以运用此随机流
● 特点:
- 该对象即能读又能写
- 内部维护了一个byte数组,并通过指针可以操作数组中的元素
- 可以通过getFilePionter方法获取指针位置,和通过seek方法设置指针的位置
- 该对象就是将字节输入流和输出流进行了封装
- 源或目的只能是文件
2. 构造方法
- RandomAccessFile(File file,String mode):创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。
- RandomAccessFile(String name,String mode):创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。
参数:String mode ;有几种形式
"r" :以只读方式打开,调用结果对象的任何write方法都将导致抛出IOException。 "rw" :打开以便读取和写入。如果该文件不存在,则尝试创建该文件。 "rws":打开以便读取和写入,对于"rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 "rwd":打开以便读取和写入,对于"rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
3. 示例
package cn.itcast.io.p4.randomFile; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class RandomAccessFileDemo { public static void main(String[] args) throws IOException { File file = new File("RandomAccessFile.txt"); randomWrite(file); // writeFile(file); readFile(file); }
public static void randomWrite(File file) throws IOException { RandomAccessFile raf = new RandomAccessFile(file,"rw"); raf.seek(100*8); // 从数组下标800的位置插入长度为8的数据数据 raf.write("赵四".getBytes()); raf.writeInt(94); raf.close(); }
public static void readFile(File file) throws IOException { RandomAccessFile raf = new RandomAccessFile(file, "r"); // 通过seek设置指针位置 raf.seek(2*8);//随机的读取,只要指定指针的位置即可。 // 读取从2*8位置开始的数据 byte [] buf = new byte [4]; raf.read(buf); String name2 = new String(buf); int ag2 = raf.readInt(); System.out.println(name2); System.out.println(ag2); raf.close(); }
// 如果randomaccessfile对象写入一些人员信息,比如姓名年龄 public static void writeFile(File file) throws IOException { // 如果文件不存在 则创建 ,如果文件存在 不创建 RandomAccessFile raf = new RandomAccessFile(file,"rw"); raf.write("王武".getBytes()); raf.writeInt(97); raf.write("小陆".getBytes()); raf.writeInt(98); raf.write("呗七".getBytes()); raf.writeInt(99); raf.write("王八".getBytes()); raf.writeInt(100); raf.close(); } }