在java中为文本文件创建简单索引

在java中为文本文件创建简单索引,java,file-io,indexing,Java,File Io,Indexing,我需要为一个大的文本文件实现一个简单的索引方案。文本文件包含键值对,我需要在不将完整文件加载到内存中的情况下读回特定的键值对。该文本文件非常庞大,包含数百万个条目,并且没有对键进行排序。根据用户输入,需要读取不同的键值对。所以我不希望每次都读取完整的文件。请让我知道java文件处理api中的确切类和方法,这些类和方法将有助于以简单高效的方式实现这一点。我希望在不使用lucene等外部库的情况下实现这一点。正如评论所指出的,在最坏的情况下,您需要对整个文件进行线性搜索,平均搜索一半。但幸运的是,你

我需要为一个大的文本文件实现一个简单的索引方案。文本文件包含键值对,我需要在不将完整文件加载到内存中的情况下读回特定的键值对。该文本文件非常庞大,包含数百万个条目,并且没有对键进行排序。根据用户输入,需要读取不同的键值对。所以我不希望每次都读取完整的文件。请让我知道java文件处理api中的确切类和方法,这些类和方法将有助于以简单高效的方式实现这一点。我希望在不使用lucene等外部库的情况下实现这一点。

正如评论所指出的,在最坏的情况下,您需要对整个文件进行线性搜索,平均搜索一半。但幸运的是,你可以做一些技巧

如果文件没有太大变化,那么创建一个文件副本,在其中对条目进行排序。理想情况下,使副本中的记录具有相同的长度,以便可以直接进入排序文件中的第n个条目

如果没有足够的磁盘空间,那么创建一个索引文件,将原始文件中的所有键作为键,并将原始文件中的偏移量作为值。再次使用固定长度记录。或者更好,将此索引文件设置为数据库。或者将原始文件加载到数据库中。无论哪种情况,磁盘存储都非常便宜


编辑:要创建索引文件,请使用RandomAccessFile打开主文件并按顺序读取。在每个条目的开头使用“getFilePointer()”方法读取文件中的位置,并将该位置加上键存储在索引文件中。当查找某个文件时,从索引文件读取文件指针,并使用“seek(long)”方法跳转到原始文件中的点。

我建议创建一个索引文件。扫描输入文件并将每个键及其偏移量写入
列表
,然后对列表进行排序并将其写入索引文件。然后,每当您想查找一个键时,您都会读入索引文件并对列表进行二进制搜索。找到所需的密钥后,将数据文件作为
RandomAccessFile
打开,并查找密钥的位置。然后,您可以读取密钥和值。

如果您想要的密钥-值对恰好是文件中的最后一个,那么您将不得不在某个时候读取整个内容。如果您试图找到一个不存在的密钥,您所有人都必须读取整个文件。要为文件编制索引,可以读取一次,避免再次读取。档案有多大?你可能可以加载所有文件。好的,他必须至少读取整个文件一次,才能为其编制索引。索引时,可以跟踪每个键/值对的字节位置。然后,要检索一个特定的键/值对,您将获取其字节位置,然后跳到文件中的该位置以读取值。但是如果值很小,那么所有这些功能可能都不值得,因为索引本身会占用大量内存。@Michael:我需要知道java中哪些类和函数可以简单地实现这一点。文本文件是巨大的,包含数百万个条目,值是长字符串。因此,我需要实现一个小索引和一种方法来跳到文本中的特定条目file@vjain27我不知道如何对文件进行随机访问,但我知道这是可能的。尝试使用
seekablebytechnel
类。就索引而言,您可能只需要使用
地图
,其中,map的key是您的key,map的value是文件中key/value对的字节位置。实际上,我想问一下如何使用java文件处理api创建您提到的索引文件,以及哪些类/方法有助于创建和读取索引。