欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

1.5 RandomAccessFile类:动态读取文件内容

发布时间:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 1.5 RandomAccessFile类:动态读取文件内容 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

所谓动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾。动态读取需要用到 Java 中的 RandomAccessFile 类。

RandomAccessFile 是 Java 输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。由于 RandomAccessFile 可以从任意位置访问文件,所以在只需要访问文件部分内容的情况下,使用 RandonAccessFile 类是一个很好的选择。

RandomAccessFile 对象包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个 RandomAccessFile 对象时,该对象的文件记录指针位于文件头(也就是 0 处),当读/写了 n 个字节后,文件记录指针将会向后移动 n 个字节。除此之外,RandonAccessFile 可以自由移动该记录指针,既可以向前移动,也可以向后移动。

RandomAccessFile 类中提供了一些常用读取和写入数据的方法,如表 1 所示。

方法名及返回值类型说明
boolean readBoolean()从文件中读取一个 boolean 值
byte readByte()从文件中读取一个带符号位的字节
char readChar()从文件中读取一个字符
int readlnt()从文件中读取一个带符号位的整数
long readLong()从文件中读取一个带符号位的 long 值
String readLine()从文件中读取下一行文本
void seek(long pos)指定从文件起始位置开始的指针偏移量
void writeBoolean(boolean v)以字节的形式向文件中写入一个 boolean 值
void writeByte(int v)以单字节的形式向文件中写入一个 byte 值
void writeChar(int v)以双字节的形式向文件中写入一个 char 值
void writelnt(int v)以4字节的形式向文件中写入一个整数
writeLong(long v)以8字节的形式向文件中写入一个 long 值
void writeBytes(String s)以字节序列的形式向文件中写入一个字符串
void skipBytes(int n)以当前文件指针位置为起始点,跳过 n 字节

RandomAccessFile 类的构造方法有如下两种重载形式。

  • RandomAccessFile(File file, String mode):访问参数 file 指定的文件,访问形式由参数mode 指定,mode 参数有两个常用的可选值 r 和 rw,其中 r 表示只读,rw 表示读写。
  • RandomAccessFile(String name, String mode):访问参数 name 指定的文件,mode参数的含义同上。
  • 注意:如果使用 rw 方式声明 RandomAccessFile 对象时,要写入的文件不存在,系统将自动进行创建。

    例 1
    编写一个程序,使用 RandomAccessFileDemo 类创建一个 words.txt 文件,然后写入一个长中文字符串,再从第 6 个字节开始读取并输出。

    1)创建一个 RandomAccessFileDemo 类对象。在 main() 方法中创建到 H:\JavaCodes\words.txt 的 File 对象,如果该文件已经存在则先删除再创建,代码如下所示。

    public class RandomAccessFileDemo {public static void main(String[] args) {File file = new File("H:\\myJava\\words.txt"); // 指定文件路径if (file.exists()) { // 判断文件是否存在file.delete();}try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

    2)创建 RandomAccessFile 对象,以读写方式操作 File 对象。定义一个要写入的字符串,再将其进行格式的转换。这样是为了使其写入文件的内容不出现乱码,再将转换后的内容写入文件,代码如下所示。

    import java.io.File; import java.io.IOException; import java.io.RandomAccessFile;public class RandomAccessFileDemo {public static void main(String[] args) throws IOException {File file = new File("H:\\myJava\\words.txt"); // 指定文件路径if (f.exists()) // 判断文件是否存在{f.delete(); // 存在则先删除}f.createNewFile(); // 再创建RandomAccessFile raf = new RandomAccessFile(f,"rw");String str1 = "晴天,阴天,多云,小雨,大风,中雨,小雪,雷阵雨"; // 要写入的字符串String str2 = new String(str1.getBytes("GBK"),"ISO-8859-1"); // 编码转换raf.writeBytes(str2); //写入文件} }

    3)打印出当前指针的位置,然后将其移动到第 6 个字节。再定义一个长度为 2 的 byte 数组,然后开始进行内容的循环读取,将读出的内容以字符串的形式输出到控制台,代码如下所示。

    System.out.println("当前文件指针的位置:" + raf.getFilePointer()); raf.seek(6); // 移动文件指针 System.out.println("从文件头跳过6个字节,现在文件内容如下:"); byte[] buffer = new byte[2]; int len = 0; while ((len = raf.read(buffer, 0, 2)) != -1) {System.out.print(new String(buffer, 0, len)); // 输出文件内容 }

    4)运行程序,程序运行结果如下所示,显示了写入字符串后指针的位置,以及从文件开关跳过 6 个字节后读取到的字符串,图 1 为写入文件中的字符串内容。

    当前文件指针的位置:48 从文件头跳过6个字节,现在文件内容如下: 阴天,多云,小雨,大风,中雨,小雪,雷阵雨


    对比输出结果和图 1 发现,中文字符串已成功写入记事本中,但是读出的字符串内容少了两个字和一个逗号,这是由于使用 RandomAccessFile 的 seek() 方法跳过了前 6 字节(1 个汉字占两字节)。在本程序中将中文字符串进行了编码转换,然后再写入文件。读取时调用的是带有 3 个参数的 read() 方法将记事本中的内容读取出来。

    注意:要写进文本的内容是中文,如果不进行字符的转换,写进去的会是乱码,读取出来的内容也会是乱码。

    《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

    总结

    以上是生活随笔为你收集整理的1.5 RandomAccessFile类:动态读取文件内容的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。