• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

Java中逐行读取文件的多种方式

Java基础 tiantian 2050次浏览 0个评论 扫描二维码

对于应用中常见的输入输出(I/O)场景,Java提供了一个数量庞大,种类繁多的类层次系统。对于初学者来说,很容易被各式各样的输入输出(I/O)所迷惑,不知道如何进行选择。Java应用中,与各种文件交互的场景非常多,而且,Java应用经常需要逐行读取文件。对于逐行读取文件,本文将试图遍寻所有的可能方式,并对它们进行比较。

Java中逐行读取文件的多种方式

简单方法

首先,我们看两个最直接,最常见的方式。

方法一:

private static void readFile1(File fin) throws IOException {
FileInputStream fis = new FileInputStream(fin);

//Construct BufferedReader from InputStreamReader
BufferedReader br = new BufferedReader(new InputStreamReader(fis));

String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}

br.close();
}

方法二:

private static void readFile2(File fin) throws IOException {
// Construct BufferedReader from FileReader
BufferedReader br = new BufferedReader(new FileReader(fin));

String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}

br.close();
}

我们使用如下的方式来调用上述的两个方法:

//use . to get current directory
File dir = new File(".");
File fin = new File(dir.getCanonicalPath() + File.separator + "in.txt");

readFile1(fin);
readFile2(fin);

上述的两个方式都可以逐行地读取文本文件。

方法对比

实际上,上述两个方法的差别非常小,都是利用的 BufferedReader 的 readLine()方法。它们的唯一区别仅在于构造 BufferedReader 对象的参数和方式,方法一使用 InputStreamReader ;方法二使用 FileReader 。它们之间有什么本质区别吗?

在Java Doc中是这样说的:

InputStreamReader 是一座从 字节流(byte streams) 到 字符流(character streams) 的桥梁,它读取字节并按照某种编码规范(utf8,gbk等)把字节解码成字符。实际上,InputStreamReader 不仅可以处理文件字节流,其他的字节流也可以处理,比如网络字节流,类路径资源,压缩文件流等等。

FileReader 是读取字符(文本)文件的的便利工具类。该类的构造函数采用JVM中默认字符编码集,并且认为默认的字节缓存器的大小是合适的。FileReader 只能使用JVM中的默认字符编码集,而且无法指定特定的字符编码集。因此,在应用程序可能会运行在不同的操作平台和系统上是,使用这个便利工具类来操作文件,不是一个非常明智的选择。

总结起来:InputStreamReader 永远是一个比 FileReader 安全的选择。

值得一提的是,最好不用使用诸如 “/” 或者 “\” 之类的符号来作为文件路径分隔符,永远应该优先考虑使用 File.separator, 这个分割符可以确保,不管应用程序运行在任何类型的操作平台或操作系统之上,文件的路径永远是正确的。另外,所有的文件路径或者URL路径等,都应该优先考虑使用相对路径,这样可以减少在路径问题上犯错。

新增方法

在JDK7中,加入了一些输出输入(I/O)相关的新特性。因此,对于逐行读取文件,JDK7中多了一个新方法:

Charset charset = Charset.forName("US-ASCII");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException x) {
System.err.format("IOException: %s%n", x);
}

实际上,该方法只是一个语法糖而已,与方法一只在构造形式上存在区别。我们看一下 newBufferedReader 方法的源码:

public static BufferedReader newBufferedReader(Path path, Charset cs){
CharsetDecoder decoder = cs.newDecoder();
Reader reader = new InputStreamReader(newInputStream(path), decoder);
return new BufferedReader(reader);
}

JDK中关于输入输出(I/O)的类数量非常多,为了不迷失其中,在深入了解和分析其中的某一个类之前,应该首先掌握这些类之间的层次结构关系。


天天编码 , 版权所有丨本文标题:Java中逐行读取文件的多种方式
转载请保留页面地址:http://www.tiantianbianma.com/java-read-file-by-line.html/
喜欢 (2)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址