我必須在我的程序中讀取txt文件。我目前正在使用FileReader和BufferedReader。我試圖使用掃描儀,但比FileReader和BufferedReader慢。有什麼課程可以更快地讀取文件嗎?它必須用Java語言編寫。Java,從txt文件中讀取速度最快的課程
我需要閱讀從文本文件
我必須在我的程序中讀取txt文件。我目前正在使用FileReader和BufferedReader。我試圖使用掃描儀,但比FileReader和BufferedReader慢。有什麼課程可以更快地讀取文件嗎?它必須用Java語言編寫。Java,從txt文件中讀取速度最快的課程
我需要閱讀從文本文件
如果正在讀取的文件很大,那麼您應該在FileReader
的頂部使用BufferedReader
以提高讀取性能。
或者,你可以嘗試的東西likethis: -
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append("\n");
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
,或者你可以試試這個程序。對於較大的文件,它工作得更快: -
public String readDoc(File f) {
String text = "";
int read, N = 1024 * 1024;
char[] buffer = new char[N];
try {
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
while(true) {
read = br.read(buffer, 0, N);
text += new String(buffer, 0, read);
if(read < N) {
break;
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
return text;
}
我要讀取的文件可能很大(大於100 MB)。 現在即時通訊這樣那樣的 http://pastebin.com/WUaJUT1G 我可以做得更快? 我正在爲大學項目做這件事,我需要以最快的速度製作所有片段(閱讀,創建樹和在樹中搜索)。 – user1736332
這種方法是一種更好的方法。我已經檢查過了。 –
@ user1736332: - 我剛剛更新了我的答案,其中包含適用於較大文件的快速代碼。請檢查它。 –
(用空格splited字符串)的所有單詞假設你讀內存,最快的所有文件,從代碼編寫的角度來看,就是:
List<String> lines = Files.readAllLines(yourFile, charset);
從執行的角度來看,我認爲性能如果不是更好(這應該是由編寫它的團隊優化的)。
然後,您可以拆分或做任何你需要的。
讀取和拆分的速度爲85 MB/sec
。 我使用了560 MB文件,每行有20列。 下面是代碼:
package csvreader_speedtest;
import java.io.*;
public class Csvreader_SpeedTest {
final char delimiter = ',';
String[] splitted = new String[64];
Csvreader_SpeedTest(String filename) throws Throwable {
File file = new File(filename);
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
long t0 = System.currentTimeMillis();
while ((line = reader.readLine()) != null) {
split(line);
}
long t1 = System.currentTimeMillis();
reader.close();
System.out.println("read " + file.length() + " bytes in " + (t1 - t0) + " ms");
}
private void split(String line) {
int idxComma, idxToken = 0, fromIndex = 0;
while ((idxComma = line.indexOf(delimiter, fromIndex)) != -1) {
splitted[idxToken++] = line.substring(fromIndex, idxComma);
fromIndex = idxComma + 1;
}
splitted[idxToken] = line.substring(fromIndex);
}
}
輸出:
read 561362951 bytes in 6575 ms
更新: 如果我使用的splitted = line.split(",");
代替split(line);
,速度下降到32 MB/sec
更新2:而不破,則速度爲194 MB/sec
。你需要多快?
我需要替換/ /等所有符號。 ,! ? - ()[] {}:; ''到''(空格),然後將所有空格分隔開來,如何做到這一點呢? – user1736332
這是完全不同的問題,爲了得到最可靠的答案,我建議把它貼出來,ei:「什麼是用空格替換字符串中所有外觀的最快方法?「 – Serg
如果你的文件很大Files.readAllLines將不起作用。但是如果你仍然想嘗試NIO,很簡單:
FileInputStream fis = new FileInputStream("test.txt");
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8");
BufferedReader br = new BufferedReader(rdr);
...
你有沒有具體的證據表明從文件中讀取是程序中的瓶頸?之後你對數據做了什麼,文件有多大?請注意,我會避免'FileReader'自己 - 使用'InputStreamReader'封裝'FileInputStream',所以你可以明確地設置編碼。 –
也許你的瓶頸是分裂線而不是閱讀文件?有許多方法可以加速String.split()。根據我的經驗,BufferedReader速度非常快。 – Serg
理論上,Java NIO可以以比IO更快的速度讀取文件 –