Java 允许使用 RandomAccessFile 类直接访问文件中的任何位置,非常适合操作需要乱序读取或写入的数据。与InputStream和OutputStream类不同,RandomAccessFile实现了DataInput和DataOutput接口,它们提供了操作原始数据类型(如int、double等)的方法。
RandomAccessFile 结构和生成器
构造函数:
RandomAccessFile(String nomeArquivo, String acesso)
void seek(long novaPos) throws IOException
代码示例:随机访问双精度值
下面是一个示例,将六个双精度值写入文件,然后在特定位置读取它们。
import java.io.*; class RandomAccessDemo { public static void main(String args[]) { double data[] = { 19.4, 10.1, 123.54, 33.0, 87.9, 74.25 }; double d; // Abre e usa um arquivo de acesso aleatório try (RandomAccessFile raf = new RandomAccessFile("random.dat", "rw")) { // Grava os valores no arquivo for(int i = 0; i < data.length; i++) { raf.writeDouble(data[i]); } // Lê valores específicos com o método seek() raf.seek(0); // Busca o primeiro valor d = raf.readDouble(); System.out.println("Primeiro valor: " + d); raf.seek(8); // Busca o segundo valor d = raf.readDouble(); System.out.println("Segundo valor: " + d); raf.seek(8 * 3); // Busca o quarto valor d = raf.readDouble(); System.out.println("Quarto valor: " + d); System.out.println("\nValores alternados:"); for(int i = 0; i < data.length; i += 2) { raf.seek(8 * i); // Busca o i-ésimo valor d = raf.readDouble(); System.out.print(d + " "); } } catch(IOException exc) { System.out.println("Erro de I/O: " + exc); } } }
代码说明:
写入:将Double值写入random.dat文件。由于每个 double 占用 8 个字节,因此每个值都以 8 个字节的倍数开始(0、8、16、...)。
使用seek()阅读:
代码输出
输出示例:
Primeiro valor: 19.4 Segundo valor: 10.1 Quarto valor: 33.0 Valores alternados: 19.4 123.54 87.9
重要要点:
使用seek()定位:定义在文件中任何位置读/写的指针位置。
使用字节进行位置控制:由于每个 double 占用 8 个字节,因此我们可以使用 8 的倍数来计算每个值的位置。
此示例对于有效处理大量数据非常有用,仅访问必要的点而不遍历整个文件。
以上是随机访问文件的详细内容。更多信息请关注PHP中文网其他相关文章!