随机存取文件RandomAccessFile
在Java中,RandomAccessFile
类允许你访问文件的任何部分,而不必从头开始读取或写入整个文件。它提供了读取和写入文件内容的功能,就像文件是一个大型字节数组一样。你可以使用 RandomAccessFile
来执行类似于文件指针的操作,在文件中的任意位置进行读写.
构造方法
RandomAccessFile(String name,String mode)
RandomAccessFile(File file,String mode)
使用方法
接口DataInput
接口DataOutput
getFilePointer():返回当前文件指针位置;
Seek(long pos):把文件指针定位于pos的位置;
Length():得到文件的长度.
实例
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileExample {
public static void main(String[] args) {
String fileName = "example.txt";
try (RandomAccessFile raf = new RandomAccessFile(fileName, "rw")) {
// 写入一些数据
raf.writeBytes("Hello, World!\n");
raf.writeLong(1234567890L);
raf.writeChars("这是中文字符\n");
// 移动文件指针到文件开始位置
raf.seek(0);
// 读取数据
byte[] buffer = new byte[1024];
int bytesRead = raf.read(buffer);
String data = new String(buffer, 0, bytesRead);
System.out.println("读取的初始数据: " + data); // 这可能包含乱码,因为读取了整个缓冲区
// 移动文件指针到长整型数据的位置
raf.seek(13); // "Hello, World!\n".length() == 13,假设使用UTF-8编码
long number = raf.readLong();
System.out.println("读取的长整型数据: " + number);
// 假设我们要覆盖一些数据
raf.seek(0);
raf.writeBytes("你好,世界!\n"); // 覆盖掉"Hello, World!\n"
// 再次读取以确认更改
raf.seek(0);
bytesRead = raf.read(buffer);
data = new String(buffer, 0, bytesRead);
System.out.println("读取的修改后数据: " + data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
请注意,在读取和写入时,你需要特别小心文件的编码和字符长度。在上面的示例中,我们假设 “Hello, World!\n” 使用UTF-8编码时占用13个字节,但这取决于实际的字符编码。同样,
readChars()
方法读取两个字节并转换为字符,这可能不适合所有情况。
另外,RandomAccessFile
的性能可能不如专门为大量数据设计的流(如BufferedInputStream
和BufferedOutputStream
),因为它提供的功能更为底层。在处理大文件时,请考虑这些性能因素。