我是java新手...在我当前的项目中我需要读取和写入一个非常大的文本文件(1 GB - 5 GB)...首先我使用这个类: BufferedReader 和 BufferedWriter
public static String read(String dir) {
BufferedReader br;
String result = "", line;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(dir), "UTF-8"));
while ((line = br.readLine()) != null) {
result += line + "\n";
}
} catch (IOException ex) {
//do something
}
return result;
}
public static void write(String dir, String text) {
BufferedWriter bw;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dir), "UTF-8"));
bw.write("");
for (int i = 0; i < text.length(); i++) {
if (text.charAt(i) != '\n') {
bw.append(text.charAt(i));
} else {
bw.newLine();
}
}
bw.flush();
} catch (IOException ex) {
//do something
}
}
这些类非常好但不适用于巨大的文件...
然后我使用 MappedByteBuffer 作为read()
方法(我不知道如何使用此类编写文件):
public static String read(String dir) {
FileChannel fc;
String s = "";
try {
fc = new RandomAccessFile(dir, "r").getChannel();
MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
buffer.load();
buffer.force();
for (int i = 0; i < buffer.limit(); i++) {
s += (char) buffer.get();
} //I know the problem is here
buffer.clear();
inChannel.close();
} catch (IOException e) {
//do something
}
return s;
}
但仍然无法读取大文件(超过30-40 MB),甚至NotePad也比我的应用程序快:))
另一个问题是我不知道如何以第二种方式改变编码(例如“UTF-8”,“ANSI”,......)
那么伙计们,请告诉我哪些是读写laaaarge文件的最佳方法? 任何想法?答案 0 :(得分:2)
result += line + "\n";
此行尝试将整个文件内容保留在内存中。尝试按照这样的方式处理每一行
while ((line = br.readLine()) != null) {
processLine( line ); // this may write it to another file.
}
答案 1 :(得分:1)
至少,我建议改变
result += line + "\n";
到StringBuilder。
resultBldr.append(line).append("\n");
这可以避免在每一行上创建一个新的字符串对象 - 一个越来越大,越来越大的字符串对象! -
此外,您一定要将输出逐行写入文件 。不要累积所有文本,然后输出它。
换句话说,在这种情况下,不建议您在read
和write
函数之间完全分离。
答案 2 :(得分:0)
认为字符串的每个连接都会创建一个新字符串,因此,如果您读取40 MB大文件的每个字符并连接,则在read()
中创建的字符串总计为40.000.000字符串。
尝试使用StringBuffer
代替String
,这对于这种情况是可以重复使用的。
答案 3 :(得分:0)
一次性读取1GB到5GB范围内的大尺寸文件总是一个坏主意。将会有巨大的性能,您的应用程序将会放慢速度。
最好将这个巨大的文件拆分成更小的块,然后按块读取它。我想如果你开始用较小的块读取文件,你编写的代码将完全正常工作。
您是否听说过HDFS系统,Solr索引,apache hadoop框架,专门用于处理大量数据。你可能想看看它。