是否有一种干净的方法来确定RandomAccessFile是否为只读?

时间:2017-06-14 21:16:52

标签: java

我正在寻找一种“好”方式来确定RandomAccessFile是否为只读

非“好”的方式包括:

  • 使用反射来读取“rw”字段的值(不是独立实现)
  • 读取一个字节,向后搜索,写入字节(不是线程安全)

我尝试编写一个空字节数组,但无论RandomAccessFile是以只读还是读写模式构造,调用都会成功。


到目前为止我发现的一种可行的方法是获得FileChannel,然后尝试创建一个读写映射。

RandomAccessFile raf = new RandomAccessFile("someFile.txt", "r");

raf.getChannel().map(MapMode.READ_WRITE, 0, 0);

在此示例中,映射尝试抛出NonWritableChannelException,然后可以捕获该异常并用于指示RandomAccessFile是只读的。


但是,我对上述方法有一些顾虑。

  1. API目前不提供释放内存映射的方法,它由垃圾收集器处理,在某些操作系统(例如Windows)上,当部分文件是内存映射时,无法删除文件
    (注意:我希望创建一个大小为0且位置= 0的地图可能会避免Windows映射限制,但我还没有测试它
  2. 根据FileChannel.map()文档,创建地图是一项有点昂贵的操作

1 个答案:

答案 0 :(得分:0)

获取FileChannel并尝试创建锁定。如果RAF是只读的,它将失败。为什么是另一个问题。

但我同意@Andreas。这是一个你不应该问的问题。您的应用程序应该能够告诉自己如何打开文件而不需要欺骗。