gpt4 book ai didi

java - 如何返回随机访问文件中一行的地址?

转载 作者:行者123 更新时间:2023-11-29 08:09:37 28 4
gpt4 key购买 nike

我正在尝试用 Java 创建一个随机访问文件。我换行写了一些东西。

  1. 如何在 Java 中返回该行的地址?

此外,我对 RAF 有点困惑。

例如我有一个文件,其中包含以下按字母顺序排列的条目

乔治 10 10 8

3 月 9 日 10 日 10 日

尼克 8 8 8

尼古拉斯 10 10 9

我想返回 Nickolas 的成绩。我如何在 RAF 中声明它?

有没有什么方法可以“读取(“Nickolas”)”并将行返回给我?

提前致谢

最佳答案

随机访问文件通常包含二进制数据而不是 ascii(例如纯文本)数据。您显示的示例是 ascii。

由于数据是 ascii,这意味着查找文件中的不同位置并不容易。事实上,通常获取 Nickolas 成绩的方法是逐行读取文件并将每一行解析为列。然后,比较 Nickolas 的第一列。

例如,


BufferedReader in = new BufferedReader(new FileReader("grades.txt"));
String line = in.readLine();
while(null != line) {
String [] columns = line.split(" ");
if( columns[0].equals("Nickolas") )
System.out.println("I found the line! " + line);
line = in.readLine();
}

编辑:

有很多方法可以加快速度。这是三个:

将所有数据存储在一个 HashMap 中

如果您没有太多记录,或者如果每条记录不占用太多空间,您可以将它们全部读入 RAM。您还可以使用 HashMap 将学生姓名映射到他们的记录。例如:


HashMap<String, Student> grades = new HashMap<String, Student>();
BufferedReader in = new BufferedReader(new FileReader("grades.txt"));
String line = in.readLine();
while(null != line) {
String [] columns = line.split(" ");
grades.put( column[0],
new Student( /* create student class instance from columns */ );
line = in.readLine();
}

现在,查找将非常快。

使用二进制搜索

如果您的记录太多而无法放入 RAM,您可以将所有学生数据写入一个随机访问(二进制)文件。在这里,您有几个选择:您可以使每条记录的长度不同,或者您可以使每条记录具有固定长度。固定长度的记录更容易进行某些类型的搜索,例如二进制搜索。

例如,如果您知道每条记录有 100 个字节,那么您就知道如何找到存储这些记录的二进制文件中的第 n 条记录。基本上,读取 99*n 个字节。那么接下来的100字节就是第100条记录。

因此,如果记录按学生姓名排序,您可以很容易地使用二进制搜索来查找特定学生。这种方法仍然很快,尽管不如基于 RAM 的数据结构快。

使用 HashMap 作为索引

另一种选择是结合我上面提到的两种方法。将数据写入二进制文件,并将记录的字节偏移量存储在 HashMap 中。 HashMap 可以像以前一样使用学生姓名作为键,但随后将一个长整数偏移量存储到随机访问文件中的记录。因此,要查找特定学生,您可以使用 HashMap 找到字节偏移量,然后“查找”到文件中的记录,然后读取它。即使记录的长度不同,最后一种方法也能奏效。

关于java - 如何返回随机访问文件中一行的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932086/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com