Java FileInputStream如何找到该文件?

Java FileInputStream如何找到该文件?,java,windows,file-io,Java,Windows,File Io,我正在设计一个程序,需要从包含大约10^8个文件的文件夹中读取文件 FileInputStream如何从提供的文件名中找到所需的文件?它的工作方式是否类似于具有O1查找时间的hashmap,还是线性遍历给定文件夹中的文件直到找到匹配项 我想这可能与windows文件存储的工作方式有关,而不是与FileInputStream有关,但我真的不确定。它要求操作系统查找文件。操作系统是如何做到这一点的?这取决于操作系统和文件系统。至少在某些情况下,答案是,是的,它就像一个HashMap。另一方面,我知道

我正在设计一个程序,需要从包含大约10^8个文件的文件夹中读取文件

FileInputStream如何从提供的文件名中找到所需的文件?它的工作方式是否类似于具有O1查找时间的hashmap,还是线性遍历给定文件夹中的文件直到找到匹配项


我想这可能与windows文件存储的工作方式有关,而不是与FileInputStream有关,但我真的不确定。

它要求操作系统查找文件。操作系统是如何做到这一点的?这取决于操作系统和文件系统。至少在某些情况下,答案是,是的,它就像一个HashMap。另一方面,我知道至少有一些操作系统/文件系统组合在同一目录中有几千个以上的文件时会陷入严重困境。

它要求操作系统查找该文件。操作系统是如何做到这一点的?这取决于操作系统和文件系统。至少在某些情况下,答案是,是的,它就像一个HashMap。另一方面,我知道至少有一些操作系统/文件系统组合在同一目录中有几千个以上的文件时会陷入严重困境。

文件名会传递给操作系统,它会读取目录以查找匹配的名称。它可能会优化查找,但Java不会参与其中


<>你可以考虑将文件分解成多个目录,并理想地使用更少的文件。打开和关闭许多小文件花费了大部分时间打开和关闭文件描述符。查找和读取通常要小得多。

文件名被传递到操作系统,它读取目录以查找匹配的名称。它可能会优化查找,但Java不会参与其中


<>你可以考虑将文件分解成多个目录,并理想地使用更少的文件。打开和关闭许多小文件花费了大部分时间打开和关闭文件描述符。查找和读取通常要小得多。

为此,请考虑使用SimpleFileVisitor。档案有多大?请记住,在NTFS上,最小分配单元是4096字节,所以对于10 ^ 8文件,平均磁盘空间开销将是大约200 GB。档案有多大?请记住,在NTFS上,最小分配单元是4096字节,因此对于10^8个文件,平均磁盘空间开销大约为200GB。您知道在哪里可以找到操作系统的高效查找,以查看哪里是安全的,或者哪里会出问题吗?您不能测试一下吗,@gravityplanx。只需将cd刻录到另一个目录并键入。如果这是快速的,那么Java也是如此。@Ingo我还没有创建10GB的文件结构,如果它是一个死胡同,我宁愿避免这样做。如果没有这么大的文件夹,很难说它的效率有多高。我现在正在开发一种产品,它可以在磁盘上保存数千个文件。我们计算每个文件名的两个字符的散列,并使用散列作为存储文件的子目录的名称。对于数百万个文件,我会将其推广到多个级别的子目录。@gravityplanx您还没有吗?那就别做了。我有处理非常大的目录的经验,可以容纳多达一百万个文件。一个简单的ls-lt甚至需要几分钟才能开始打印到屏幕上,因为排序需要很长时间。当文件浏览器需要显示这样一个目录时,它只会被卡住。但是10^8个文件?一个简单的目录列表只会占用大量内存,更不用说CPU了。不惜一切代价避免!使用多级目录结构。你知道我在哪里可以找到操作系统的高效查找,看看哪里是安全的,或者哪里会遇到麻烦吗?你不能测试一下吗,@gravityplanx。只需将cd刻录到另一个目录并键入。如果这是快速的,那么Java也是如此。@Ingo我还没有创建10GB的文件结构,如果它是一个死胡同,我宁愿避免这样做。如果没有这么大的文件夹,很难说它的效率有多高。我现在正在开发一种产品,它可以在磁盘上保存数千个文件。我们计算每个文件名的两个字符的散列,并使用散列作为存储文件的子目录的名称。对于数百万个文件,我会将其推广到多个级别的子目录。@gravityplanx您还没有吗?那就别做了。我有处理非常大的目录的经验,可以容纳多达一百万个文件。一个简单的ls-lt甚至需要几分钟才能开始打印到屏幕上,因为排序需要很长时间。当文件浏览器需要显示这样一个目录时,它只会被卡住。但是10^8个文件?一个简单的目录列表只会占用大量内存,更不用说CPU了。不惜一切代价避免!使用多级目录结构。进一步信息:我正在有效地尝试使用d
目录作为一个超级映射,文件名作为键,序列化文件作为对象。目前的问题需要对这个超级地图进行非常少的读/写操作,因此不存在打开和关闭许多文件的问题,但希望通过将数据管理的责任推到操作系统上,我可以防止程序需要加载实际上是10GB的对象,而在程序的任何单独运行中,我们只需要访问20个文件。在这种情况下。。。意见?@gravityplanx虽然没有我希望的那么有效,但这似乎是可行的。拥有许多文件可能是最简单的。我会考虑为每个3-4个字符做一个目录。因为这可能会提高您的程序和在此目录上使用的任何工具的性能。进一步信息:我正在有效地尝试使用目录作为超级地图,文件名作为键,序列化文件作为对象。目前的问题需要对这个超级地图进行非常少的读/写操作,因此不存在打开和关闭许多文件的问题,但希望通过将数据管理的责任推到操作系统上,我可以防止程序需要加载实际上是10GB的对象,而在程序的任何单独运行中,我们只需要访问20个文件。在这种情况下。。。意见?@gravityplanx虽然没有我希望的那么有效,但这似乎是可行的。拥有许多文件可能是最简单的。我会考虑为每个3-4个字符做一个目录。因为这可能会提高程序和在此目录上使用的任何工具的性能。