RandomAccessFile类的简单使用

在将数据写入文件的指定位置时用到了RandomAccessFile类,特此记录,方便查阅。
RandomAccessFile是Java 输入/输出流体系中功能最丰富的文件访问类,它提供了很多的方法来访问文件内容,支持随机访问

构造方法:

RandomAccessFile(String name,String mode)
RandomAccessFile(File file,String mode)

mode 为访问模式:
"r" :以只读方式打开指定文件,如果试图对该RandomAccessFile执行写入方法,都会抛出IOException
"rw" :以读,写方式打开指定文件。如果该文件尚不存在,则会尝试创建该文件
"rws":相当于"rw"模式,还要求对文件的内容或元数据的每个更新都同步写入底层存储
"rwd":相当于"rw"模式,还要对文件内容的每个更新都同步写入到底层存储设备

RandomAccessFile方法:

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

void write(byte[] b) 
          //将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。 
void write(byte[] b, int off, int len) 
         //将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。 
void write(int b) 
          //向此文件写入指定的字节。 
void writeBoolean(boolean v) 
          //按单字节值将 boolean 写入该文件。 
void writeByte(int v) 
          //按单字节值将 byte 写入该文件。 
void writeBytes(String s) 
          //按字节序列将该字符串写入该文件。 
void writeChar(int v) 
          //按双字节值将 char 写入该文件,先写高字节。 
 void writeChars(String s) 
          //按字符序列将一个字符串写入该文件。 
 void writeDouble(double v) 
          //使用 Double 类中的 doubleToLongBits 方法将双精度参数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。 
 void writeFloat(float v) 
          //使用 Float 类中的 floatToIntBits 方法将浮点参数转换为一个 int,然后按四

在向文件中的指定位置插入指定内容,如果直接将文件记录指针移动到中间的某个位置开始输出,则新输出的内容会覆盖文件中原有的文件,如果需要向指定位置插入内容,程序首先把插入点后面的内容读入缓冲区,等把需要插入的数据写入文件后,再将缓冲区的内容追加到文件后面。

 /**
     * 向指定文件的指定位置插入指定的内容
     *
     * @param fileName      指定文件名
     * @param pos           指定文件的指定位置
     * @param insertContent 指定文件的指定位置要插入的指定内容
     */
    public static void insert(String fileName, long pos,
                              String insertContent) throws IOException {
        RandomAccessFile raf = null;
        //创建一个临时文件来保存插入点后的数据
        File tmp = File.createTempFile("tmp", null);
        FileOutputStream tmpOut = null;
        FileInputStream tmpIn = null;
        tmp.deleteOnExit();
        try {
            raf = new RandomAccessFile(fileName, "rw");
            tmpOut = new FileOutputStream(tmp);
            tmpIn = new FileInputStream(tmp);
            raf.seek(pos);
            //--------下面代码将插入点后的内容读入临时文件中保存---------
            byte[] bbuf = new byte[64];
            //用于保存实际读取的字节数
            int hasRead = 0;
            //使用循环方式读取插入点后的数据
            while ((hasRead = raf.read(bbuf)) > 0) {
                //将读取的数据写入临时文件
                tmpOut.write(bbuf, 0, hasRead);
            }
            //----------下面代码插入内容----------
            //把文件记录指针重新定位到pos位置
            raf.seek(pos);
            //追加需要插入的内容
            raf.write(insertContent.getBytes());
            //追加临时文件中的内容
            while ((hasRead = tmpIn.read(bbuf)) > 0) {
                raf.write(bbuf, 0, hasRead);
            }
        } finally {
            if (raf != null) {
                raf.close();
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_42447739/article/details/128096197