Java IO 4 : RandomAccessFile
RandomAccessFile:
认识:java输入/输出流体系中功能最丰富的文件内容访问类 既可以读取文件内容,也可以向文件传输数据,并且支持“随机访问“的方式,程序可以跳转到任意地方来读写数据。
特点:与OutputStream/Writer不同,RandomAccessFile允许自由定位记录指针,可以不从开始的地方输出,因此RandomAccessFile可以向已经存在的文件后追加内容,如果程序需要向已经存在的文件后追加内容,应该使用RandomAccessFile
局限:只能读写文件,不能读写其他IO节点
RandomAccessFile 两个方法操作文件记录指针
long getFilePointer() 返回文件记录指针的当前位置
void seek(long pos) 将文件记录指针定位到pos位置
RandomAccessFile类为用户提供了两种构造方法:两种方法一个意思,一个是File指定,一个是String指定文件名
RandomAccessFile(File file, String mode)
RandomAccessFile(String name, String mode)
mode的四个值如下:
模 式 | 作 用 |
r | 表示以只读方式打开,调用结果对象的任何write方法都将导致抛出IOException |
rw | 打开以便读取和写入,如果该文件尚不存在,则尝试创建该文件 |
rws | 打开以便读取和写入,相对于"rw",还要求对文件内容或元数据的每个更新都同步写入到底层存储设备 |
rwd | 打开以便读取和写入,相对于"rw",还要求对文件内容的每个更新都同步写入到底层存储设备 |
public class File03 { public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile("D://demo/a.txt", "r"); //初始位置为0 System.out.println("RandomAccessFile文件指针初始位置:" + raf.getFilePointer()); raf.seek(10); byte[] bbuf = new byte[1024]; int hasRead = 0; while((hasRead = raf.read(bbuf)) > 0) { System.out.println(new String(bbuf , 0 , hasRead)); } } }
往文件最后追加内容:
//往文件里面追加内容 RandomAccessFile raf = new RandomAccessFile("D://demo/a.txt", "rw"); raf.seek(raf.length()); raf.write("这是追加的内容".getBytes());
往文件中间指定的位置添加内容:
RandomAccessFile不能向文件指定的内容插入内容,如果直接插,要把指定指针后的内容先读入一个临时的地方存起来, 插入需要的内容后, 再去将临时存储的内容读过来。
/** * 使用RandomAccessFile 向文件指定的位置添加内容 * @throws IOException */ public static void insert(String fileName , long pos , String insertContent) throws IOException { File temp = File.createTempFile("temp", null); temp.deleteOnExit(); //jvm 退出时删除临时文件 FileOutputStream tempOut = new FileOutputStream(temp); FileInputStream tempIn = new FileInputStream(temp); RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); System.out.println(raf.length()); raf.seek(pos); //将插入点后的内容读取到临时文件 byte[] bbuf = new byte[100]; int hasRead = 0; while((hasRead = raf.read(bbuf)) > 0) { tempOut.write(bbuf, 0, hasRead); } //重新回到插入点 , 将需要添加的内容添加到到文件 raf.seek(pos); raf.write(insertContent.getBytes()); //将临时文件中的内容添加到原文件当中 while((hasRead = tempIn.read(bbuf)) > 0) { raf.write(bbuf, 0, hasRead); } } public static void main(String[] args) throws IOException { insert("D://demo/a.txt", 10 , "这是追加到文件中间的内容"); }
温故而知新