1

我正在尝试在 java 中创建一个随机访问文件。我在一个新行中写了一些东西。

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

另外,我对 RAF 有点困惑。

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

乔治 10 10 8

玛丽 9 10 10

尼克 8 8 8

尼古拉斯 10 10 9

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

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

提前致谢

4

2 回答 2

3

随机访问文件通常包含二进制数据而不是 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 作为索引

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

于 2012-01-19T19:40:54.040 回答
2

没有“线”这样的东西。但是,有行分隔符(换行符,即'\n')。您可以写一行,但只写数据后跟换行符。您可以读取一行,但同样只能读取直到找到换行符或文件末尾。

因此,要找到第n行,您必须继续阅读直到计算出 n-1 个换行符,并继续阅读直到找到下一个(或文件末尾)。

于 2012-01-19T19:36:43.013 回答