如何创建一个新的缓冲读取器对象,从另一个停止的位置开始读取?

时间:2013-01-24 16:48:33

标签: java bufferedreader bufferedinputstream

我有一个缓冲读卡器,逐行读取一个大文件以删除重复的行。

不是将整个文件加载到内存中,而是希望通过使用两个缓冲读取器来执行此操作:第一个迭代文件的固定部分,将每个部分逐个加载到内存中。

在每次迭代中,第二个缓冲读取器将从第一个缓冲读取器停止到文件末尾,以检查文件中是否已存在加载的部分。

问题是我不能让新的独立缓冲读取器对象(不是引用)从第一个停止的位置开始。

我需要一种方法来找出第一个缓冲读卡器的文件位置,这样我就可以告诉第二个缓冲读卡器从哪里开始。

到目前为止我尝试过:

将第一个对象发送到第二个构造函数。

这实际上有效,但两者都有相同的迭代器,所以第一个用第二个移动到文件的末尾

BufferedReader cleanfilereader2 = new BufferedReader(cleanfilereader);

bufferedReader.mark()设置缓冲读卡器的位置,但我仍然需要知道第一个读卡器的位置。

注意:

  • 行数不恒定
  • 无法将整个文件加载到内存中
  • 时间和记忆都是问题

4 个答案:

答案 0 :(得分:1)

如果文件很大且时间有问题,那么可能不是最佳方式,因为你必须经常读取每一行(O(n ^ 2)次)。

如果你有足够的内存,我建议逐行读取文件,并将每行的哈希值存储在ArrayList中。每行只需要4个字节(一个整数)。然后,您可以在此数组列表中搜索重复项(快速,因为它在内存中)。这会为您提供所有可能重复的列表,您只需在删除它们时检查这些是否是真正的重复项。

答案 1 :(得分:0)

您需要BufferedReader.skip,但没有像tell这样的C来提供当前位置。因此删除BufferedReader,并使用一个简单的随机访问文件,或java.nio,一个内存映射文件缓冲区。

答案 2 :(得分:0)

如果您需要阅读当前位置,可以使用FileChannel作为

  

文件通道在其文件中具有当前位置即可   查询和修改

您可以使用Channels.newInputStream()从频道创建InputStream(如果您不想关闭基础频道,请不要关闭它)

答案 3 :(得分:0)

试试这个......(如果我能帮你弄错的话。)

import java.io.*;
class delete{
public static void main(String args[])throws IOException{
FileInputStream fis1=new FileInputStream("delete.java");
FileInputStream fis2=fis1;
String temp="";
byte buff[]=new byte[100];
while(true){
if (fis1.read(buff)==-1)break;
temp=new String(buff);
System.out.print(temp);
if(fis2.read(buff)==-1)break;
temp=new String(buff);
System.out.print(temp);
}}
}

输出: 上面的代码。

这个问题非常有趣。所以请评论讨论。