【发布时间】:2014-03-18 14:06:10
【问题描述】:
我是 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),即使记事本也比我的应用程序快 :))
还有一个问题是我不知道如何以第二种方式更改编码(例如“UTF-8”、“ANSI”、...)
各位,请告诉我哪种方式是读写 laaaarge 文件的最佳方式? 有什么想法吗?
【问题讨论】:
-
你想对所有这些文本做什么?
-
您根本不应该将 1-2GB 的文件读入
String- 这将是 a) 缓慢和 b) 内存密集型。您可能需要对文件进行一些转换,以便 stream 它 - 一次读取和写入一行。更重要的是,我会推荐 this article 在 Java 中使用字符串。 -
try (InputStream in = new BufferedInputStream(new FileInputStream(dir))) { while (in.read() != -1); }- 看起来你实际上并没有对你读过的数据做任何事情,所以这应该对你有用,而且速度非常快。 -
在 TextArea 上显示它并进行一些搜索并将结果保存在日志文件中
-
像记事本这样的程序会在您滚动时流式传输文件并执行各种其他优化。您不能只将 2GB 的数据转储到
TextArea。就搜索而言,如果文件那么大,您将需要以某种方式对其进行索引。
标签: java bufferedreader bytebuffer mappedbytebuffer