在Java中读取纯文本文件

1052

似乎在Java中有不同的方法来读写文件数据。

我想从文件中读取ASCII数据,可能的方法有哪些,它们之间有什么区别?


27
我不同意将其关闭为“不具建设性”,但幸运的是,它很可能会被关闭为重复问题。在如何从文件内容创建字符串?将文件读入字符串的最简单方法是什么?用于读取文件的最简单类是什么?中有很好的答案。 - Jonik
1
不使用循环: {{{ Scanner sc = new Scanner(file, "UTF-8"); sc.useDelimiter("$^"); // 正则表达式匹配空字符 String text = sc.next(); sc.close(); }}} - Aivar
3
Python 中没有类似于 "read()" 的东西,可以将整个文件读取为一个字符串,这真的很有趣。 - kommradHomer
2
这是最简单的方法:http://www.mkyong.com/java/how-to-read-file-from-java-bufferedreader-example/ - deldev
31个回答

-2

我编写的这段代码对于非常大的文件来说速度要快得多:

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;
}

12
如果使用简单的字符串拼接而不是 StringBuilder,要比它快得多,我对此表示怀疑。 - PhiLho
6
我认为主要的速度提升来自于以1MB(1024 * 1024)块的方式进行读取。不过,你可以通过将1024 * 1024作为BufferedReader构造函数的第二个参数来轻松实现相同的效果。 - gb96
4
我不相信这被彻底测试过。以这种方式使用+=会使任务的复杂度从线性变成二次方!对于几 MB 的文件,这个过程将开始变得非常缓慢。要解决这个问题,你可以把文本块保存在一个 list<string> 中,或者使用上述的 StringBuilder。 - kritzikratzi
5
比什么更快?它肯定比向StringBuffer追加要慢。-1 - user207421
1
@bcsb1001 垃圾。它们并不“更好”。它们只是非线程安全的,这在此处不会出现,因为构建器/缓冲区是方法本地的。将字符串附加到一个字符串上比使用StringBuilder慢得多,这就是为什么有StringBuilder存在的原因,而一个简单的测试很容易证明这一点。您还需要解决此代码无法正确处理流结束的事实,或者说根本没有处理。 - user207421
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接