RandomAccesseFile
RandomAccess 具有读写文件数据的功能,可以随机地从文件的任何位置开始执行读写数据的操作。 RandomAccessFile可以将文件以只读或者读写的方式打开,具体使用哪种方式取决于创建它所采用的构造方法。
参考书籍《Java基础入门》
RandomAccesseFile 的构造方法
RandomAccesseFile(File file,String mode) | 使用参数file指定被访问的文件,并使用mode来指定访问模式 |
RandomAccesseFile(String name,String mode) | 使用参数name指定被访问文件的路径,并使用mode来指定访问方式 |
参数mode有4个值:
1、r:表示以只读的方式打开文件。如果以只读方式打开,再对RandomAccesseFile对象执行写入操作,会抛出I/OException异常。
2、rw:表示以“读写”的方式打开文件。如果该文件不存在,则会自动创建该文件。
3、rws:表示以“读写”的方式打开文件。与“rw”相比,它要求对文件的内容或元数据的每个更新都同步写入到底层的存储设备。
4、rwd:表示以“读写”的方式打开文件。与“rw”相比,它要求对文件的内容的每个更新都同步写入到底层的存储设备。
RandomAccessFile对象中包含了一个记录指针来当前读写处的位置。 当程序新建RandomAccessFile对象时,该对象的文件记录指针会在文件开始出(即表示为0的位置),当读到n个字节后,文件记录指针会向后移n个字节。除了可以按顺序读写外,RandomAccessFile对象还可以自由移动记录指针,可以向前,也可以向后移动。‘
RandomAccessFile 的常用方法
long getFilePointer() | 返回当前读写指针所处的位置 |
void seek(long pos) | 设置读写指针的位置,与文件开头相隔pos个字节数 |
int skipBytes(int n) | 使读写指针从当前位置开始,跳过n个字节 |
void write(byte[ ] b) | 将指定的字节数组写入到这个文件,并从当前文件指针开始 |
void setLength(long newLength) | 设置此文件的长度 |
final String readLine() | 从指定文件当前指针读取下一行内容 |
例子1:有些视频软件,观看视频软件时需要付费,但是一般都会几次免费的观看机会。下面用RandomAccessFile简单实现记录软件试看次数,初始次数为3,看一次视频,减少一次。
新建一个test.txt文件里面输入数字3作为软件试看次数(文件就放在项目下)
试看次数模拟代码:
import java.io.*;
public class RandomAccessFileTest {
public static void main(String[] args) {
RandomAccessFile raf = null;
try {
//创建RandomAccessFile对象,并以读写模式打开文件test.txt文件,rw:读写
//直接放在项目下路径为test.txt 如果放在src目录下路径为"src/test.txt"
raf = new RandomAccessFile("test.txt","rw");
//读取还可以免费观看的次数,第一次读取时view为3
int view = Integer.parseInt(raf.readLine());
//判断剩余次数
if(view > 0) {
//(每观看一次,次数就减少一次)
view = view -1;
System.out.println("您还可以免费观看 " + view + "次");
//将记录指针重新指向文件开头
raf.seek(0);
//将剩余次数再次写入文件
raf.write((view + "").getBytes());
}else {
System.out.println("您的观看次数已经用完了!");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(raf != null) {
try {
raf.close();//关闭
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
试看次数效果:
控制台:
test.txt文件
例子2:RandomAccessFile 使用seek()方法,来读取指定位置的内容
在项目下新建一个random.txt文件,不用添加内容。
读取指定位置的内容代码:(与文件相隔3个字符处,读取6个字节)
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileTest02 {
public static void main(String[] args) throws IOException {
//创建RandomAccessFile对象,并以读写模式打开文件random.txt文件,rw:读写
RandomAccessFile raf = new RandomAccessFile("random.txt", "rw");
//random.txt中写入内容
raf.write("RandomAccessFile".getBytes());
raf.seek(3);//设置读写指针的位置,与文件开头相隔3个字节数
//读取
byte[] buf = new byte[6];
int len = raf.read(buf);//读取6个字节
System.out.println(new String(buf,0,len));
raf.close(); // 关闭
}
}
写入后内容后的random.txt:
读取的内容: