RandomAccessFile 是输入/输出流体系中,功能最丰富的文件内容访问类,即能读对一个文件进行读操作,也可以进行写操作
案例1
/**
*
* 使用RandomAccessFile 向指定文件的指定位置加指定内容:
* 需求: 向项目下的hello.txt的第二个位置后,加入 “大帅比” 内容
*
* hello.txt 内容如下:
* abcd
*
* @author 王XX
*
*/
public class Demo9 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile("hello.txt", "rw");
//让文件记录指针,移到2
raf.seek(2);
raf.write("大帅比".getBytes());
/**
* 结果内容如下:
* ab大帅比
*
* 直接插入会覆盖数据,而且覆盖的多少是取决于你,写的字节数,这里是3个汉字
* 而且是UTF-8编码,所以是9个字节,也就是说会覆盖b后面的9个字节数据
*/
}catch (IOException e) {
e.printStackTrace();
}finally {
if(raf != null) raf.close();
}
}
}
案例2:
/**
* RandomAccessFile: 任意访问文件,是一个既可以读,又可以写的IO流
*
* 原始数据: abcd
* 期望数据: ab大帅比cd
*
* 通过案例已知,直接写的话,会覆盖原有的数据,因此换一个思路:
* 1.先将文件指针移到指定的位置
* 2.将指针后面的数据,先存入到一个临时文件中
* 3.这时文件记录指针,移到了后面,因此又得指定到原来的位置
* 4.然后写入内容
* 5.最后把临时文件里面的内容,追加到后面即可
*
* @author XXX
*
*/
public class Demo10 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = null;
FileOutputStream fos = null;
FileInputStream fis = null;
File tempFile = File.createTempFile("tmp", ".txt");
System.out.println(tempFile.exists());//虽然我这里看不到,但它确实创建了
tempFile.deleteOnExit();//临时一般程序完后,会让它销毁
try {
raf = new RandomAccessFile("hello.txt", "rw");
fos = new FileOutputStream(tempFile);
fis = new FileInputStream(tempFile);
System.out.println("文件记录指针: "+raf.getFilePointer());//0
raf.seek(2);
byte[] bytes = new byte[1024];
//返回实际读取的字节数
int len;
//最多从输入流中读取bytes.length个字节,并存储到数组中,返回实际读取的字节数
while((len = raf.read(bytes)) != -1) {
System.out.println("实际读取的字节数: "+len);//2
fos.write(bytes, 0, len);
}
/**
* 记得把指针移到原来的位置不然文件指针移到了末尾去了!!
* 那么你就不是从你之前seek()的位置后面写了,而是读完之后的后面写
*/
System.out.println("文件记录指针:"+raf.getFilePointer());//4
raf.seek(2);
//然后在写入
raf.write("大帅比".getBytes());
//然后从临时文件中读取,写入
while((len = fis.read(bytes)) != -1) {
raf.write(bytes, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fis != null) fis.close();
if(fos != null) fis.close();
if(raf != null) fis.close();
}
}
}
为什么要学习这个嘞,为以后写一个多线程下载工具打下一个基础,可能现在你还体会不到它的用处
图解案例2
最后有什么写的不好的,希望各位可以不吝指出
觉得对你有帮助的,想打赏的可以打赏一下,哈哈哈,多少无所谓,这也是对我一种支持与鼓励吗,最后不喜勿喷
有志同道合的小伙伴可以加QQ群讨论:897992110