我正在尝试在java中创建一个随机访问文件。 我用新的东西写了一些东西。
另外,我对RAF感到有些困惑。
例如,我有一个文件,按字母顺序包含以下条目
George 10 10 8
Mary 9 10 10
尼克8 8 8
Nickolas 10 10 9
我想退回Nickolas的成绩。 我如何在英国皇家空军中宣布?
是否有任何方法可以“阅读(”Nickolas“)”并将该线路返回给我?
先谢谢
答案 0 :(得分: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作为索引
另一种选择是结合我上面提到的两种方法。将数据写入二进制文件,并将记录的字节偏移量存储在哈希映射中。哈希映射可以像以前一样使用学生名称作为键,但随后将长整数偏移量存储在随机访问文件中的记录中。因此,要查找特定的学生,您可以使用哈希映射找到字节偏移量,然后“搜索”到文件中的记录然后读取它。即使记录的长度不同,最后一种方法仍然有效。
答案 1 :(得分:2)
没有“线”这样的东西。但是有行分隔符(换行符,'\n'
)。您可以编写一行但只写入数据后跟换行符。您可以读取一行,但只能读取,直到找到换行符或文件末尾。
所以要找到 n 行,你必须继续阅读,直到你计算了 n-1 换行符,并继续阅读,直到找到下一个(或者文件的结尾)。