我正在尝试读取一个java文件并同时修改它。这就是我需要做的:我的文件格式为:
aaa
bbb
aaa
ccc
ddd
ddd
我需要通读文件并获取出现次数的计数并修改重复项以获取以下文件:
aaa - 2
bbb - 1
ccc - 1
ddd - 2
我尝试使用RandomAccessFile
执行此操作,但无法执行此操作。有人可以帮我解决这个问题吗?
答案 0 :(得分:8)
如果你不同时做两件事,那就容易多了。最好的方法是遍历整个文件,计算散列中每个字符串的所有出现次数,然后将所有结果写入另一个文件。然后,如果需要,将新文件移到旧文件上。
您永远不想同时读取和写入同一文件。每次进行写入时,文件中的偏移量都会移动,而读取光标将无法跟踪。
答案 1 :(得分:1)
我这样做: - 解析原始文件并将所有条目保存到新文件中。使用固定长度的数据块将条目写入新文件(因此,假设您的最长字符串长度为10个字节,将10 + x作为块长度,x用于您要沿条目保存的额外信息。所以第10个条目在文件中将在字节位置10 *(10 + x))。您还必须知道要创建的条目数(因此文件大小为noOfEntries * blocklength,使用RandomAccesFile和setLength来设置此文件长度)。 - 现在使用quicksort算法对文件中的条目进行排序(我的想法是最终有一个排序文件,这使得事情变得更容易和更快。散列在理论上也可以工作,但你必须处理重新排列重复的条目然后将所有重复项分组 - 这里不是真正的选择。 - 使用现在排序的条目解析文件。保存指向条目第一次出现的条目的指针。增加重复次数,直到有新条目。更改第一个条目,并将要添加的其他信息添加到新的“最终结果”文件中。以这种方式继续处理已排序文件中的所有剩余条目。
结论:我认为这应该是一个相当快的并且使用合理数量的资源。但是,这取决于您拥有的数据。如果您有大量重复项,则快速排序性能会降低。此外,如果您的最长数据输入时间长于平均数,则也会浪费文件空间。
答案 2 :(得分:0)
如果必须,有一些方法可以操作同一个文件并更新计数器,而无需打开另一个文件或将所有内容保存在内存中。但是,最简单的方法会非常慢。
答案 3 :(得分:-2)
import java.util.*;
import java.io.*;
import java.util.*;
class WordFrequencyCountTest
{
public static void main( String args[])
{
System.out.println(" enter the file name");
Scanner sc = new Scanner(System.in);
String fname= sc.next();
File f1 = new File(fname);
if(!f1.exists())
{
System.out.println(" Source file doesnot exists");
System.exit(0);
}
else{
try{
FileReader fis = new FileReader(f1);
BufferedReader br = new BufferedReader(fis);
String str = "";
int count=0;
Map<String, Integer> map = new TreeMap<String, Integer>();
while((str = br.readLine()) != null )
{
String[] strArray = str.split("\\s");
count=1;
for(String token : strArray) // iteration of strArray []
{
if(map.get(token)!=null )
{
count=map.get(token);
count++;
map.put(token, count);
count=1;
}else{
map.put(token, count);
}
}
}
Set set=map.entrySet();
Iterator itr = set.iterator();
System.out.println("========");
while(itr.hasNext())
{
Map.Entry entry = (Map.Entry)itr.next();
System.out.println( entry.getKey()+ " "+entry.getValue());
}
fis.close();
}catch(Exception e){}
}
}
}