您的位置:首页 > 编程语言 > Java开发

Java IO的RandomAccessFile的使用

2017-05-12 16:46 441 查看
参考:

Java IO的RandomAccessFile的使用

RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。

RandomAccessFile类中比较重要的2个方法如下,其他的方法和普通IO方法类似。RandomAccessFile包含InputStream的三个read方法,也包含OutputStream的三个write方法。同时RandomAccessFile还包含一系列的readXxx和writeXxx方法完成输入输出。

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


构造方法:

/**
* model各个参数详解
* r 代表以只读方式打开指定文件
* rw 以读写方式打开指定文件
* rws 读写方式打开,并对内容或元数据都同步写入底层存储设备
* rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备
* **/
public RandomAccessFile(String name, String mode)


使用示例:

1、在电脑桌面新建test.txt,并输入以下数据:



2、java代码:

import java.io.*;

/**
* Created by Administrator on 2017/5/12.
*/
public class RandomAccessTest {

public static void main(String[] args) {
String path = "C:\\Users\\Administrator\\Desktop\\test.txt";

//任意位置读取
int seekPointer = 20;
randomRead(path, seekPointer);//读取的方法

//追加写
randomWrite(path);//追加写的方法

//插入数据
insert(path, 33, "\nlucene是一个优秀的全文检索库");
}

/**
* 读的方法
*
* @param path        文件路径
* @param seekPointer 指针位置
**/
public static void randomRead(String path, int seekPointer) {
try {
/**
* model各个参数详解
* r 代表以只读方式打开指定文件
* rw 以读写方式打开指定文件
* rws 读写方式打开,并对内容或元数据都同步写入底层存储设备
* rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备
*
* **/
RandomAccessFile raf = new RandomAccessFile(path, "r");
//获取RandomAccessFile对象文件指针的位置,初始位置是0
System.out.println("RandomAccessFile文件指针的初始位置:" + raf.getFilePointer());
raf.seek(seekPointer);//移动文件指针位置

byte[] buff = new byte[1024];
//用于保存实际读取的字节数
int hasRead = 0;
//循环读取
while ((hasRead = raf.read(buff)) > 0) {
//打印读取的内容,并将字节转为字符串输入
System.out.println(new String(buff, 0, hasRead));
}
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 追加方式
* 写的方法
*
* @param path 文件路径
***/
public static void randomWrite(String path) {
try {
/**以读写的方式建立一个RandomAccessFile对象**/
RandomAccessFile raf = new RandomAccessFile(path, "rw");

//将记录指针移动到文件最后
raf.seek(raf.length());
raf.write("我是追加的 \r\n".getBytes());
raf.close();
} catch (Exception e) {
e.printStackTrace();
}

}

/**
* 实现向指定位置
* 插入数据
*
* @param fileName      文件名
* @param points        指针位置
* @param insertContent 插入内容
**/
public static void insert(String fileName, long points, String insertContent) {
try {
File tmp = File.createTempFile("tmp", null);
tmp.deleteOnExit();//在JVM退出时删除

RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
//创建一个临时文件夹来保存插入点后的数据
FileOutputStream tmpOut = new FileOutputStream(tmp);
FileInputStream tmpIn = new FileInputStream(tmp);
raf.seek(points);
/**将插入点后的内容读入临时文件夹**/

byte[] buff = new byte[1024];
//用于保存临时读取的字节数
int hasRead = 0;
//循环读取插入点后的内容
while ((hasRead = raf.read(buff)) > 0) {
// 将读取的数据写入临时文件中
tmpOut.write(buff, 0, hasRead);
}

//插入需要指定添加的数据
raf.seek(points);//返回原来的插入处
//追加需要追加的内容
raf.write(insertContent.getBytes());
//最后追加临时文件中的内容
while ((hasRead = tmpIn.read(buff)) > 0) {
raf.write(buff, 0, hasRead);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}


运行效果:

控制台:

RandomAccessFile文件指针的初始位置:0
he is a techter
hadoop is perfect


test.txt:

i am is a person he is a techt
lucene是一个优秀的全文检索库er
hadoop is perfect
我是追加的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: