Java 使用BufferedReader将大型文本文件读取并存储到字符串中

Java 使用BufferedReader将大型文本文件读取并存储到字符串中,java,string,bufferedreader,Java,String,Bufferedreader,可能重复: 我正在使用BufferedReader读取一个大文本文件,并希望将读取器读取的内容全部存储到字符串中。这似乎无法正常工作,因为当我打印出字符串时,它似乎只抓取了文件的最后一部分。我做错什么了吗 试试看{ 字符串str=“”; BufferedReader fileReader=new BufferedReader(new fileReader(args[2]); while(fileReader.ready()){ str+=(char)fileReader.read(); } 系

可能重复:

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

试试看{
字符串str=“”;
BufferedReader fileReader=new BufferedReader(new fileReader(args[2]);
while(fileReader.ready()){
str+=(char)fileReader.read();
}
系统输出打印项次(str);
}捕获(IOE异常){
e、 printStackTrace();
}

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


否则,您的方法效率很低。使用此处的答案之一

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

我做错什么了吗

好吧,有些事情是错的,有些事情是不理想的

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


当然,现在您可能会发现仍然看到相同的结果-可能文件中有
“\r”
作为换行符,而您所在的系统只将其解释为“返回到行的开头”,因此每一行都会覆盖上一行。我们真的不知道这一点,但一旦您用对
Files.toString()
的单个调用替换了代码,就更容易诊断了。

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

尝试使用此代码(未经测试,但应该可以工作)

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


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

也许他想保留行尾(
\r\n
vs.
\n
vs
\r
)。我不明白为什么在缓冲读取器上逐字符读取会如此低效。否则,+1@JBNizet:Edited。在
BufferedReader
上没有其他地方那么糟糕,但它仍然毫无必要地低效。我刚刚做了一个微基准测试,它的效率确实要低很多。虽然我总是使用缓冲区,但我不会想到差异会如此之大(使用缓冲区的速度快30倍左右),我一个字符一个字符地阅读,因为我写这篇文章是为了一个作业。既然我不能使用番石榴,你能给我提供一些关于改进我所写内容以实现目标的建议吗?感谢到目前为止的所有帮助。@user1736256:我不明白为什么“为作业写这篇文章”是逐字阅读的理由。我已经为您提供了很多改进建议,但另一个建议是使用
StringBuilder
而不是字符串串联。即使你不能用番石榴作为你的最终代码,你至少可以用它来诊断这部分问题。有许多有用的注释。
// Use the appropriate encoding for the file, of course.
String text = Files.toString(new File(args[2]), Charsets.UTF_8);
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();
 }
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();
 }