【问题标题】:Can multiple Java processes read the same file at the same time?多个Java进程可以同时读取同一个文件吗?
【发布时间】:2015-01-05 08:45:40
【问题描述】:

是否可以同时从两个或多个不同的进程中读取同一个文件?

我想在 Java 应用程序中做这样的事情:

final File f = new File("read-only-file");
final FileInputStream in = new FileInputStream(f);
int b;
while((b = in.read()) != null) {
    //process b
    Thread.sleep(10); //several read processes would really happen at the same time
}

没有应用程序会写入文件,但多个线程/应用程序需要同时执行上述代码。上面的代码可以吗,还是在这种情况下我需要使用任何特殊机制?

此外,该解决方案应该独立于平台,并且必须在类似 Linux 的系统上运行。

【问题讨论】:

  • 你可以相对容易地尝试一下,但答案是肯定的。
  • @SotiriosDelimanolis 那么请写一个答案,以便我可以接受。
  • 它可能会让你的 HDD 发疯 - 除非你有 SSD 或某种 RAID。
  • @BoristheSpider 你对 fs 缓存有什么看法?
  • @fge 取决于我想的文件大小。

标签: java linux file concurrency io


【解决方案1】:

多个Java进程可以同时读取同一个文件吗?

当然可以;最终,操作系统的作用是确保每个进程/线程以自己的速度读取,因此您不必担心。

当然,您可能希望在不同线程之间共享尽可能多的资源,但肯定不是 I/O 流;当我们使用它时,如果您使用 Java 7 或更高版本,请使用新的文件 API(这是 2014 年;距离 Java 7 已经有 3 年了); File 与 java.nio.file 相比是一个非常劣质的 API(事实上,与大多数编程语言的文件操作 API 相比)。

【讨论】:

  • 如果我同时(在不同的线程中)多次执行问题中的代码,FileFileInputStream 对象是否相同,以便 FileInputStreams 具有相同的当前阅读位置?还是new File(path) 在多次调用时总是返回具有不同流的不同对象?
  • @MinecraftShamrock File 本质上是一个包装器 String 代表相关文件的路径。 new File 没有打开任何东西。 new FileInputStream 每次都会返回一个新的流。
  • 谢谢你的回答:)
猜你喜欢
  • 2018-01-20
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
相关资源
最近更新 更多