我有一个缓冲读卡器,逐行读取一个大文件以删除重复的行。
不是将整个文件加载到内存中,而是希望通过使用两个缓冲读取器来执行此操作:第一个迭代文件的固定部分,将每个部分逐个加载到内存中。
在每次迭代中,第二个缓冲读取器将从第一个缓冲读取器停止到文件末尾,以检查文件中是否已存在加载的部分。
问题是我不能让新的独立缓冲读取器对象(不是引用)从第一个停止的位置开始。
我需要一种方法来找出第一个缓冲读卡器的文件位置,这样我就可以告诉第二个缓冲读卡器从哪里开始。
到目前为止我尝试过:
将第一个对象发送到第二个构造函数。
这实际上有效,但两者都有相同的迭代器,所以第一个用第二个移动到文件的末尾
BufferedReader cleanfilereader2 = new BufferedReader(cleanfilereader);
bufferedReader.mark()
设置缓冲读卡器的位置,但我仍然需要知道第一个读卡器的位置。
注意:
答案 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);
}}
}
输出: 上面的代码。
这个问题非常有趣。所以请评论讨论。