2

可能重复:
如何从文件内容创建 Java 字符串

我正在使用 aBufferedReader读取一个大文本文件,并希望将阅读器读取的全部内容存储到String. 这似乎无法正常工作,因为当我打印出 . 时String,它似乎只抓取了文件的最后一部分。我在这里做错了吗?

try {
    String str = "";
    BufferedReader fileReader = new BufferedReader(new FileReader(args[2]));
    while (fileReader.ready()) {
        str += (char) fileReader.read();
    }
    System.out.println(str);
} catch (IOException e) {
    e.printStackTrace();
}
4

5 回答 5

2

Your problem is the while condition. You shouldn't use ready there. By the way, please, replace your String with StringBuffer your code will run much faster.

Try with this code (untested but should work)

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

Here a version using readLine (if you care about newlines you can still append a \n)

StringBuffer sb = new StringBuffer();

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

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

 } catch (IOException e) {
        e.printStackTrace();
 }
于 2012-10-10T21:59:57.260 回答
2

我在这里做错了吗?

好吧,有些事情是错误的,有些事情远非理想。

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

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

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

当然,现在您可能会发现您仍然看到相同的结果 - 可能文件具有"\r"换行符,而您所在的系统将其解释为“返回行首”,因此每一行都覆盖了前一行一。我们真的不能说 - 但是一旦你用一次调用替换了你的代码,Files.toString()诊断它会更容易。

于 2012-10-10T21:52:52.613 回答
1

您还可以使用 commons ioutils 的 IOUtils.toString 方法之一。

于 2012-10-11T00:38:34.283 回答
0

如果您使用的是 Java 7,请使用Files.readAllLines一行来完成此操作。

否则,您的方法效率很低。使用此处的答案之一如何从文件的内容创建 Java 字符串?

于 2012-10-10T21:51:34.660 回答
0

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

于 2012-10-10T21:51:38.060 回答