2013-02-24 48 views
0

我有一段代碼。有沒有辦法將文件的1/4寫入字符串緩衝區?

File file = new File(path); 
FileReader fr = new FileReader(file); 
BufferedReader br = new BufferedReader(fr); 
String temp; 
StringBuffer sb=new StringBuffer(); 
while((temp=br.readLine())!=null){   
    sb.append(temp); 
    sb.append(" "); 
} 

這將讀取文件的每一行並將其存儲在StringBuffer中。我的文件非常龐大,我有一個多線程的需求,以便處理速度更快。 有沒有辦法說像我只想要將文件的1/4寫入緩衝區?

我知道我不能說這個。但我想要的東西等同於此。

for(int i=0; i<reader.length/4; i++) 
+0

我不認爲你可以,但如果你知道提前四分之一的時間,你可以停止閱讀。 – Dukeling 2013-02-24 00:18:59

+0

你的處理究竟涉及什麼? (你在使用'StringBuffer'後對數據做了什麼?)? – cheeken 2013-02-24 00:20:51

+1

你是什麼意思與「相當巨大」?該文件是否總是適合內存,或者它是如此巨大,你必須以這種方式避免OutOfMemoryException? – 2013-02-24 00:24:27

回答

0

不,你不能得到解決這個問題,因爲你不能讀取文件同時,如果只有一個線程在同一時間流中讀取數據,這會同時發生,也沒有並行。所以沒有任何好處,除此之外,你將有一個更難以編寫和讀取的代碼,以及很多線程上下文切換和線程仲裁,這些並不便宜。

你可以做的是不寫一個大文件,寫更多的小文件,如果讀數據的處理很耗時,讀一個緩衝區,然後在緩衝區加載到內存中並行處理它,這將工作得很好。

此外,如果您使用單個線程,請使用StringBuilder而不是StringBuffer。

希望這會有所幫助。

+0

我正在四核運行這個。排除製造基板時的功率效率因素,我認爲並行編程是具有多個內核的目的之一。如果我錯了,請糾正我。 – Prasanna 2013-02-24 00:35:27

1

您應該能夠爲每個線程創建1 file channel,並通過該文件在偏移處使用該線程。從文件通道中,您可以獲取文件的大小以計算分割並設置其當前位置。

相關問題