在将数据写入文件的指定位置时用到了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();
}
}
}