java.io.RandomAccessFile可伸缩性(或其他选项)

时间:2012-11-29 13:49:56

标签: java multithreading io

我正在研究一些最终将在应用服务器中使用的Java代码,以访问一些非常大的文件(超过1GB,低于20GB),可能托管在NFS共享上。服务于个人请求将涉及这样做:

  1. 找到我需要阅读的大文件
  2. 导航到该文件中的随机点
  3. 从该文件中读取字节数(通常小于1MB)
  4. 返回那些字节
  5. 我现在有一些快乐的简单POC代码,只需打开一个新的只读文件并关闭它:

    RandomAccessFile raf=new RandomAccessFile(myFileName, "r");
    try{
       byte[] buffer = new byte[size];
       raf.seek(position);
       raf.reafFully(buffer);
       return buffer;
    }
    finally{
       raf.close();
    }
    

    我想知道这是一种优雅简单的方法,应该能够很好地工作,还是一种愚蠢的简单方法,在繁重的负载下会遇到很多问题(也许我需要建立一个线程安全的读者群,等等)。显然测试这个假设是最好的,但我想知道这两种方法是否有任何最佳实践或已知问题。到目前为止,我还没有弄清楚谷歌搜索......

    谢谢!

    PS。目前尚不清楚最终版本是否将托管在Windows或* nix上。目前还不清楚如何共享大文件。 PPS。应用服务器可能在群集中配置,因此两个不同的应用服务器可能需要同时读取相同的大型共享文件。

1 个答案:

答案 0 :(得分:2)

另一种选择是java NIO,即FileChannel。 FileChannel也是可导航的 它可能比RandomAccessFile更快,因为它可以使用所谓的直接缓冲区。它有一些更有趣的功能,例如它是可中断的。