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

Dav*_*ave 5 java io multithreading

我的工作,最终将一个应用程序服务器中使用访问一些真正的大文件的一些Java代码(超过1GB,20GB下),可能托管在NFS共享.处理个人请求将涉及这样做:

  1. 找到我需要阅读的大文件
  2. 导航到该文件中的随机点
  3. 从该文件中读取字节数(通常小于1MB)
  4. 返回那些字节

我有一些快乐的简单POC代码,只需打开一个新的只读文件并关闭它:

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

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

谢谢!

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

Evg*_*eev 2

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