Java提供了一个非常有趣的读取文件内容的类: java.io.RandomAccessFile,这个类名字面意思是任意文件内容访问,特别之处是这个类不仅可以像java.io.FileInputStream一样读取文件,而且还可以写文件。
    RandomAccessFile读取文件测试代码:

    1. package com.anbai.sec.filesystem;
    2. import java.io.*;
    3. /**
    4. * Creator: yz
    5. * Date: 2019/12/4
    6. */
    7. public class RandomAccessFileDemo {
    8. public static void main(String[] args) {
    9. File file = new File("/etc/passwd");
    10. try {
    11. // 创建RandomAccessFile对象,r表示以只读模式打开文件,一共有:r(只读)、rw(读写)、
    12. // rws(读写内容同步)、rwd(读写内容或元数据同步)四种模式。
    13. RandomAccessFile raf = new RandomAccessFile(file, "r");
    14. // 定义每次输入流读取到的字节数对象
    15. int a = 0;
    16. // 定义缓冲区大小
    17. byte[] bytes = new byte[1024];
    18. // 创建二进制输出流对象
    19. ByteArrayOutputStream out = new ByteArrayOutputStream();
    20. // 循环读取文件内容
    21. while ((a = raf.read(bytes)) != -1) {
    22. // 截取缓冲区数组中的内容,(bytes, 0, a)其中的0表示从bytes数组的
    23. // 下标0开始截取,a表示输入流read到的字节数。
    24. out.write(bytes, 0, a);
    25. }
    26. System.out.println(out.toString());
    27. } catch (IOException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. }

    任意文件读取特性体现在如下方法:

    1. // 获取文件描述符
    2. public final FileDescriptor getFD() throws IOException
    3. // 获取文件指针
    4. public native long getFilePointer() throws IOException;
    5. // 设置文件偏移量
    6. private native void seek0(long pos) throws IOException;

    java.io.RandomAccessFile类中提供了几十个readXXX方法用以读取文件系统,最终都会调用到read0或者readBytes方法,我们只需要掌握如何利用RandomAccessFile读/写文件就行了。
    RandomAccessFile写文件测试代码:

    1. package com.anbai.sec.filesystem;
    2. import java.io.File;
    3. import java.io.IOException;
    4. import java.io.RandomAccessFile;
    5. /**
    6. * Creator: yz
    7. * Date: 2019/12/4
    8. */
    9. public class RandomAccessWriteFileDemo {
    10. public static void main(String[] args) {
    11. File file = new File("/tmp/test.txt");
    12. // 定义待写入文件内容
    13. String content = "Hello World.";
    14. try {
    15. // 创建RandomAccessFile对象,rw表示以读写模式打开文件,一共有:r(只读)、rw(读写)、
    16. // rws(读写内容同步)、rwd(读写内容或元数据同步)四种模式。
    17. RandomAccessFile raf = new RandomAccessFile(file, "rw");
    18. // 写入内容二进制到文件
    19. raf.write(content.getBytes());
    20. raf.close();
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. }