2010-11-22 46 views
6

我正在尝试读取一个java文件并同时修改它。这是我要做的:我的文件的格式为:JAVA:一起读写文件

aaa 
bbb 
aaa 
ccc 
ddd 
ddd 

我需要通过文件的读取,并得到出现的#的计数和修改副本来获得以下文件:

aaa - 2 
bbb - 1 
ccc - 1 
ddd - 2 

我试过用RandomAccessFile来做到这一点,但是做不到。有人能帮我解决这个问题的代码吗?

回答

8

如果你不同时做两件事情就容易多了。最好的方法是遍历整个文件,计算散列中每个字符串的所有出现位置,然后将所有结果写入另一个文件。然后,如果需要,请将新文件移到旧文件上。

你永远不想同时读写同一个文件。每次写入文件时,文件内的偏移量都会移动,读取光标将不会跟踪该文件。

+0

这也是我的想法,它只是花了我很长的时间才将它输入到工作中! – 2010-11-22 23:28:31

0

如果您需要,您可以操作同一文件并更新计数器,而无需打开其他文件或将所有内容保存在内存中。然而,最简单的方法将非常缓慢。

1

我会这样做: - 解析原始文件并将所有条目保存到一个新文件中。使用固定长度的数据块将条目写入新文件(所以,假设最长的字符串长度为10个字节,以10 + x为块长度,x表示您要沿条目保存的额外信息,因此第10个条目在文件中将在字节位置10 *(10 + x))。您还必须知道创建条目的数量(因此文件大小为noOfEntries * blocklength,使用RandomAccesFile和setLength设置此文件长度)。 - 现在使用快速排序算法对文件中的条目进行排序(我的想法是在最后有一个排序文件,这使得事情变得更加容易和快速,理论上散列效果也会起作用,但是您必须处理重新排列重复然后将所有重复项分组 - 这里不是真正的选择)。 - 使用现在排序的条目解析文件。保存一个指向条目第一次出现的条目的指针。增加重复项的数量,直到有新条目。更改第一个条目,并将您想要的那些附加信息添加到新的“最终结果”文件中。继续这种方式与排序文件中的所有剩余条目。

结论:我认为这应该是一个相当快的速度,并使用合理的资源量。但是,这取决于您拥有的数据。如果您有大量重复项,则快速排序性能会降低。另外,如果您的最长数据输入时间比平均时间长,也会浪费文件空间。

-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){} 
      } 
     } 
    }