java.io.RandomAccessFile 可扩展性(或其他选项)

标签 java multithreading io

我正在研究一些 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();
}

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

谢谢!

附言。目前还不清楚它的最终版本是托管在 Windows 还是 *nix 上。还不清楚大文件将如何共享。 聚苯硫醚。应用服务器很可能配置在集群中,因此两个不同的应用服务器可能需要同时读取同一个大型共享文件。

最佳答案

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

关于java.io.RandomAccessFile 可扩展性(或其他选项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627257/

相关文章:

Haskell primPutChar 定义

java - 如何读取保存编码的文件?

java - 方法内部有多个打开和关闭大括号。 - java

c - 使用 fprintf 的奇怪 SEGFAULTS

Java ExecutorService 和同步

multithreading - 线程中的 Perl getstore

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 获取 Java 运行时参数 --argumentName=argumentValue

java - 明智地使用重载

java - 谷歌应用引擎: How to send a Form POST?