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