RandomAcessFile类
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。
构造方法摘要
- RandomAccessFile(File file, String mode)
创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。 - RandomAccessFile(String name, String mode)
创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
关于mode:
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw"打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
“rws” 打开以便读取和写入,对于还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备
“rwd” 打开以便读取和写入, 对于"rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
方法摘要
read×3
- int read()
从此文件中读取一个数据字节。 - int read(byte[] b)
将最多 b.length 个数据字节从此文件读入 byte 数组。 - int read(byte[] b, int off, int len)
将最多 len 个数据字节从此文件读入 byte 数组。
readxx ×9
- byte readByte()
从此文件读取一个有符号的八位值。 - char readChar()
从此文件读取一个字符。 - double readDouble()
从此文件读取一个 double。
…
write × 3
- void write(byte[] b)
将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。 - void write(byte[] b, int off, int len)
将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。 - void write(int b)
向此文件写入指定的字节。
writexxx ×9
- void writeBoolean(boolean v)
按单字节值将 boolean 写入该文件。 - void writeByte(int v)
按单字节值将 byte 写入该文件。 - void writeBytes(String s)
按字节序列将该字符串写入该文件
…
文件读写的过程
RandomAccessFile对象中内含一个文件指针,读写操作都是基于指针的,也就是说总是在指针当前所指向的位置进行读写操作。它起始指向文件中的首位字节
当我们使用read方法时他就从指针处开始每次read一个字节,同样。write也是在该指针处开始写入一个字节,记住:一个RandomAccessFile对象的指针是唯一的,读写都会移动他。那么我们也就能推断出,我们new RandomAccesssFile(file,rw);如果文件不存在,他将自动被创建(这是输出流的特点),如果文件存在,那么他将从首位字节开始读/覆盖!
我们如何人为的操纵文件指针呢?
-
getFilePointer()方法 — long getFilePointer()
该方法用于获取当前RandomAccessFile的指针位置。 -
void seek(long pos)
该方法用于移动当前RandomAccessFile的指针到指定位置。 -
int skipBytes(int n)
尝试跳过输入的 n 个字节以丢弃跳过的字节。返回跳过的实际字节数(跳过n个字节之前已到达文件的末尾只是其中的一种可能,若n< 0 不跳过任何字节)
RandomAccessFile类应用——文件加密
文件复制也可以用该类,但往往不会使用这个类进行文件复制,因为RandomAccessFile类相对于其他IO类其特点在于能够自由操作文件指针实现边读边写,而文件复制则是两个文件之间的事情,无需该类也能更高效的完成
文件加密的实现
public static void test1() throws Exception {
RandomAccessFile rf = new RandomAccessFile("a.txt", "rw");
int by = 0;
long pos = 0;
while((by = rf.read()) != -1) {
int pw = by ^ 12;//选用异或^达到加密的效果,而再次运行则覆盖原文件进行解密!
rf.seek(pos);
rf.write(pw);
pos = rf.getFilePointer();
}
rf.close();
}
加密——即将文件打开时以人不能理解的形式呈现,所以我们只需变动每一个字节即可实现这一目的!然而,加减乘除似乎都不太适合进行对字节加密,因为byte空间本就不大,容易发生溢出,而且除法造成的非整除情况更是使得解密变得接近不可能!所以我们能选择的便是位运算符| ^ & < >