关于java:使用BufferedReader读取大型文本文件并将其存储到String中

Using BufferedReader to read and store large text file into a String

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to create a Java String from the contents of a file

我使用一个BufferedReader来读取一个大文本文件,并希望将读卡器读取的全部内容存储到一个String中。当我打印出String时,这似乎不能正常工作,似乎它只抓取了文件的最后一部分。我在这里做错什么了吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String str ="";

try {
    fileReader = new BufferedReader(new FileReader(args[2]));

    try {
        while (fileReader.ready()) {

            str += (char) fileReader.read();

        }

        System.out.println(str);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

您的问题是while条件。你不应该在那里使用ready。顺便说一下,请用StringBuffer替换字符串,这样代码的运行速度会快得多。

尝试使用此代码(未测试但应该有效)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
StringBuffer sb = new StringBuffer();

try {
    fileReader = new BufferedReader(new FileReader(args[2]));
    int i;
    while ((i=fileReader.read())!=-1) {
            sb.append(s);
    }

    System.out.println(sb.toString());

 } catch (IOException e) {
        e.printStackTrace();
 }

这里是一个使用readline的版本(如果您关心换行,您仍然可以附加一个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
StringBuffer sb = new StringBuffer();

try {
    fileReader = new BufferedReader(new FileReader(args[2]));
    String s;
    while ((s=fileReader.readLine())!=null) {
            sb.append(s);
            //sb.append('
'); //if you want the newline
    }

    System.out.println(sb.toString());

 } catch (IOException e) {
        e.printStackTrace();
 }


Am I doing something wrong here?

嗯,有些事情不对劲,还有一些事情不理想。

  • 有一个类型为BufferedReader的变量称为fileReader。至少可以说,这让人困惑。
  • 您使用的是fileReader,这是一个通常不好的主意,因为它总是使用平台默认编码。
  • 你只不过是在ready()返回true的时候阅读。这只返回下一次读取是否会被阻止——这可能对文件是可以的,但一般来说这绝对不是一个好主意。您应该阅读,直到下一个调用指示您已经耗尽了流。
  • 您一次读取一个字符,这有点低效——不需要对每个字符进行一次调用,而需要使用接收字符数组的read的重载,从而允许批量传输。
  • 您正在使用字符串连接来构建文件,这也是非常低效的。
  • 没有迹象表明你正在关闭阅读器。也许这是你没有发布的代码…
  • 您有两个级别的try块,没有明显的原因,而且您的IOException处理几乎总是错误的方法-您应该很少吞咽异常(即使在日志记录之后),然后像什么都没有发生一样继续。

如果可能,请避免完全编写此代码-请改用guava:

1
2
// Use the appropriate encoding for the file, of course.
String text = Files.toString(new File(args[2]), Charsets.UTF_8);

当然,您可能会发现您仍然看到相同的结果——可能文件的换行符是"
"
,而您所在的系统只解释为"返回到行首",所以每一行都覆盖了前一行。我们不能真的这么说-但是一旦你用一个对Files.toString()的调用替换了你的代码,就可以更容易地诊断它了。


您还可以使用普通ioutils的ioutils.toString方法之一。


如果这是文本文件,为什么不使用readLine()


如果你在Java 7上,使用EDCOX1 OR 0来做这一行。

否则,您的方法非常低效。使用这里的答案之一:如何从文件的内容创建Java字符串?