如何优雅地读取文件中的每一行?
最近文件操作较多,但大多数都是一行一行地读取,每一行是一条新闻。经常用的代码是这样的:
InputStream is = null;
try {
is = new FileInputStream(textPath);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 512);
// 读取一行,存储于字符串列表中
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
line = line.trim();
// do something here
}
}catch (FileNotFoundException fnfe){
fnfe.printStackTrace();
}catch (IOException ioe){
ioe.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
is = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
当do something变得很庞大时,这try语句块就变得有点臃肿。是否能存在这样的一个文件读取类,就像Iterator迭代器一样,使用hasNext()和next()遍历文件中的所有行,而将异常处理等全部隐藏起来?还是有什么其它更加优雅的方法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
java当然可以很优雅, 宇宙第一的编程语言也不是光靠sun和oracle忽悠出来的.
这里 我们需要把 文件处理 的逻辑 和 业务逻辑分开, 引入 strategy 模式是比较合适的. 文件处理的部分是不变的可以重用的, 业务逻辑是变化的.
还有就是java7 引入 try-with-resource, 已经不需要自己去关闭流了.
代码:
可以使用 commons-io 的 FileUtils:
LineIterator:
如果内存足够:
另外推荐 LZ 使用
org.apache.commons.io.Charsets.UTF_8
代替字符串的"UTF-8"
,如:因为 Java 规定了所有平台都必须实现 UTF-8 ,这里本来就不可能抛出
UnsupportedEncodingException
。Java 7 中我们就可以用java.nio.charset.StandardCharsets
了,Java 6 暂时拿这个顶一下。另外 LZ 可以用
org.apache.commons.io.IOUtils.closeQuietly
来关闭一个流。你的 finally 块可以简化为:" 每一个优雅的接口背后,都有一个龌龊的实现 “
用python可好?
撸主,「瓜娃」guava 你值得拥有:
ps:看了下源码,是把整个文件读入到
List<String>
,大文件会把内存撑爆,可以自己山寨一个: