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

5

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

我想在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的系统上工作。


1
你可以相对容易地尝试这个,但答案是肯定的。 - Sotirios Delimanolis
@SotiriosDelimanolis,请您回答一下,这样我就可以将其接受为答案了。 - MinecraftShamrock
它很可能会让你的硬盘疯狂运转 - 除非你有固态硬盘或某种RAID。 - Boris the Spider
@BoristheSpider,你对文件系统缓存有什么看法? - fge
@fge 取决于文件大小,我想。 - Boris the Spider
1个回答

6
多个Java进程可以同时读取同一个文件吗?当然可以;而且最终,操作系统会确保每个进程/线程按自己的速度读取,因此您不必担心。当然,您可能希望在不同线程之间共享尽可能多的资源,但肯定不包括I/O流;在此过程中,如果您使用Java 7或更高版本,请使用新的文件API;File与java.nio.file相比是非常低级的API(实际上,与大多数编程语言的文件操作API相比也是如此)。

如果我在不同的线程中同时执行问题中的代码,那么FileFileInputStream对象是否相同,以便FileInputStream具有相同的当前读取位置?或者每次调用new File(path)时,它是否总是返回具有不同流的不同对象? - MinecraftShamrock
1
@MinecraftShamrock File 本质上是围绕代表所讨论的文件路径的 String 的封装器。new File 并不会 打开 任何内容。每次 new FileInputStream 将返回一个新流。 - Boris the Spider
谢谢你的回答 :) - MinecraftShamrock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接