Java提供了一个非常有趣的读取文件内容的类: java.io.RandomAccessFile
,这个类名字面意思是任意文件内容访问,特别之处是这个类不仅可以像java.io.FileInputStream
一样读取文件,而且还可以写文件。
RandomAccessFile读取文件测试代码:
package com.anbai.sec.filesystem;
import java.io.*;
/**
* Creator: yz
* Date: 2019/12/4
*/
public class RandomAccessFileDemo {
public static void main(String[] args) {
File file = new File("/etc/passwd");
try {
// 创建RandomAccessFile对象,r表示以只读模式打开文件,一共有:r(只读)、rw(读写)、
// rws(读写内容同步)、rwd(读写内容或元数据同步)四种模式。
RandomAccessFile raf = new RandomAccessFile(file, "r");
// 定义每次输入流读取到的字节数对象
int a = 0;
// 定义缓冲区大小
byte[] bytes = new byte[1024];
// 创建二进制输出流对象
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 循环读取文件内容
while ((a = raf.read(bytes)) != -1) {
// 截取缓冲区数组中的内容,(bytes, 0, a)其中的0表示从bytes数组的
// 下标0开始截取,a表示输入流read到的字节数。
out.write(bytes, 0, a);
}
System.out.println(out.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
任意文件读取特性体现在如下方法:
// 获取文件描述符
public final FileDescriptor getFD() throws IOException
// 获取文件指针
public native long getFilePointer() throws IOException;
// 设置文件偏移量
private native void seek0(long pos) throws IOException;
java.io.RandomAccessFile
类中提供了几十个readXXX
方法用以读取文件系统,最终都会调用到read0
或者readBytes
方法,我们只需要掌握如何利用RandomAccessFile
读/写文件就行了。
RandomAccessFile写文件测试代码:
package com.anbai.sec.filesystem;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* Creator: yz
* Date: 2019/12/4
*/
public class RandomAccessWriteFileDemo {
public static void main(String[] args) {
File file = new File("/tmp/test.txt");
// 定义待写入文件内容
String content = "Hello World.";
try {
// 创建RandomAccessFile对象,rw表示以读写模式打开文件,一共有:r(只读)、rw(读写)、
// rws(读写内容同步)、rwd(读写内容或元数据同步)四种模式。
RandomAccessFile raf = new RandomAccessFile(file, "rw");
// 写入内容二进制到文件
raf.write(content.getBytes());
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}