RandomAccessFile学习笔记
发布日期:2021-05-06 23:31:45 浏览次数:19 分类:精选文章

本文共 2454 字,大约阅读时间需要 8 分钟。

简介

RandomAccessFile是一个神奇的存在,既可以从文件中读,又可以向文件输出数据。另外还支持“随机访问”,可以直接跳转到文件的任意位置来读写数据。

RandomAccessFile还可以自由定义指针,可向已经存在的文件内追加内容。但是,它只能读写文件,不能操作其他IO节点。

RandomAccessFile中的方法

1.构造方法

RandomAccessFile(File file, String mode)//使用File参数指定文件本身RandomAccessFile(String name, String mode)//使用String参数指定文件名

对于构造方法的mode参数,他指定了RandomAccessFile的访问模式:

“r”:以只读方式打开,调用任何write方法都会导致IOException
“rw”:打开以便读取和写入,若文件不存在就尝试创建
“rws”:打开以便读取和写入,相对于"rw",还要求对文件内容或元数据的每个更新都同步写入到底层存储设备
“rwd”:打开以便读取和写入,相对于"rw",还要求对文件内容的每个更新都同步写入到底层存储设备

2.重要方法

RandomAccessFile对象包含一个记录指针,用来标识当前读写所处的位置。当RandomAccessFile对象被创建,指针位于文件头0处。当读写N个字节后,指针也会相应后移N个字节位置。并且RandomAccessFile还可以自由移动指针位置。

long getFilePointer();//返回文件记录指针的当前位置void seek(long pos);//将文件指针定位到pos位置

RandomAccessFile的使用

通过RandomAccessFile实现文件的多线程下载,即在多线程环境下,将文件“切分”为几块,每块用不同的线程去下载。

public class Hello {       public static void main(String []args) throws Exception{           //预分配磁盘空间,磁盘创建一个指定大小的文件        RandomAccessFile raf = new RandomAccessFile("c://abc.txt", "rw");        raf.setLength(1024*1024);//分配1M的空间        raf.close();        //要写入文件的内容        String s1 = "第1个内容";        String s2 = "第2个内容";        String s3 = "第3个内容";        String s4 = "第4个内容";        String s5 = "第5个内容";        //多线程同时写入一个文件        new FileWriteThread(1024*1,s1.getBytes()).start();        new FileWriteThread(1024*2,s2.getBytes()).start();        new FileWriteThread(1024*3,s3.getBytes()).start();        new FileWriteThread(1024*4,s4.getBytes()).start();        new FileWriteThread(1024*5,s5.getBytes()).start();    }    static class FileWriteThread extends Thread{           private int skip;        private byte[] content;        public FileWriteThread(int skip,byte[] content){               this.skip = skip;            this.content = content;        }        @Override        public void run() {               RandomAccessFile raf = null;            try {                   raf = new  RandomAccessFile("c://abc.txt", "rw");                raf.seek(skip);                raf.write(content);            } catch (FileNotFoundException e) {                   e.printStackTrace();            } catch (Exception e){                   e.printStackTrace();            }finally {                   try {                       raf.close();                } catch (IOException e) {                       e.printStackTrace();                }            }        }    }}

RandomAccessFile向指定文件插入内容,会覆盖原来的数据。可以先把原来的内容读取出来,在后面追加要插入的数据,在写入文件。

使用场景

网络请求中的多线程下载和断点续传。

上一篇:Java基础之异常
下一篇:Java基础之IO笔记

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月11日 07时52分33秒