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
我使用一个
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 |
当然,您可能会发现您仍然看到相同的结果——可能文件的换行符是
"
您还可以使用普通ioutils的ioutils.toString方法之一。
如果这是文本文件,为什么不使用
如果你在Java 7上,使用EDCOX1 OR 0来做这一行。
否则,您的方法非常低效。使用这里的答案之一:如何从文件的内容创建Java字符串?