簡體   English   中英

JAVA:一起讀寫文件

[英]JAVA : read and write a file together

我試圖讀取一個java文件並同時修改它。 這就是我需要做的:我的文件格式如下:

aaa
bbb
aaa
ccc
ddd
ddd

我需要通讀文件並獲取出現次數的計數並修改重復項以獲取以下文件:

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

我嘗試使用RandomAccessFile執行此操作,但無法執行此操作。 有人可以幫我解決這個問題的代碼嗎?

如果你不同時做兩件事,那就容易多了。 最好的方法是遍歷整個文件,計算散列中每個字符串的所有出現次數,然后將所有結果寫入另一個文件。 然后,如果需要,將新文件移到舊文件上。

您永遠不想同時讀取和寫入同一文件。 每次進行寫入時,文件中的偏移都會發生偏移,而讀取光標將無法跟蹤。

我這樣做: - 解析原始文件並將所有條目保存到新文件中。 使用固定長度的數據塊將條目寫入新文件(因此,假設您的最長字符串長度為10個字節,將10 + x作為塊長度,x用於您要沿條目保存的額外信息。所以第10個條目在文件中將在字節位置10 *(10 + x))。 您還必須知道要創建的條目數(因此文件大小為noOfEntries * blocklength,使用RandomAccesFile和setLength來設置此文件長度)。 - 現在使用quicksort算法對文件中的條目進行排序(我的想法是最終有一個排序文件,這使得事情變得更容易和更快。散列在理論上也可以工作,但你必須處理重新排列重復的條目然后將所有重復項分組 - 這里不是真正的選擇。 - 使用現在排序的條目解析文件。 保存指向條目第一次出現的條目的指針。 增加重復次數,直到有新條目。 更改第一個條目,並將要添加的其他信息添加到新的“最終結果”文件中。 以這種方式繼續排序文件中的所有剩余條目。

結論:我認為這應該是一個相當快的並且使用合理數量的資源。 但是,這取決於您擁有的數據。 如果您有大量重復項,則快速排序性能會降低。 此外,如果您的最長數據條目長於平均值,則也會浪費文件空間。

如果必須,有一些方法可以操作同一個文件並更新計數器,而無需打開另一個文件或將所有內容保存在內存中。 但是,最簡單的方法會非常慢。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM