我正在嘗試讀取一個java文件並同時修改它。這是我要做的:我的文件的格式爲:JAVA:一起讀寫文件
aaa
bbb
aaa
ccc
ddd
ddd
我需要通過文件的讀取,並得到出現的#的計數和修改副本來獲得以下文件:
aaa - 2
bbb - 1
ccc - 1
ddd - 2
我試過用RandomAccessFile
來做到這一點,但是做不到。有人能幫我解決這個問題的代碼嗎?
我正在嘗試讀取一個java文件並同時修改它。這是我要做的:我的文件的格式爲: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設置此文件長度)。 - 現在使用快速排序算法對文件中的條目進行排序(我的想法是在最後有一個排序文件,這使得事情變得更加容易和快速,理論上散列效果也會起作用,但是您必須處理重新排列重複然後將所有重複項分組 - 這裏不是真正的選擇)。 - 使用現在排序的條目解析文件。保存一個指向條目第一次出現的條目的指針。增加重複項的數量,直到有新條目。更改第一個條目,並將您想要的那些附加信息添加到新的「最終結果」文件中。繼續這種方式與排序文件中的所有剩餘條目。
結論:我認爲這應該是一個相當快的速度,並使用合理的資源量。但是,這取決於您擁有的數據。如果您有大量重複項,則快速排序性能會降低。另外,如果您的最長數據輸入時間比平均時間長,也會浪費文件空間。
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){}
}
}
}
這也是我的想法,它只是花了我很長的時間纔將它輸入到工作中! – 2010-11-22 23:28:31