编程语言
首页 > 编程语言> > java-读取大文件(例如,非常大的文本文档)的最佳方法

java-读取大文件(例如,非常大的文本文档)的最佳方法

作者:互联网

我是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文件的最佳方法?
任何想法?

解决方法:

至少,我建议更改

result += line + "\n";

到StringBuilder.

resultBldr.append(line).append("\n");

这样可以避免在每一行上创建新的字符串对象-越来越大的字符串对象!

另外,您绝对应该逐行将输出内容写入文件.不要累积所有文本,然后将其输出.

换句话说,在这种情况下,不建议将读取和写入功能完全分开.

标签:bytebuffer,bufferedreader,java,mappedbytebuffer
来源: https://codeday.me/bug/20191122/2055931.html