Java中按行读取文件

作者: xmuliushuo | 来源:发表于2015-01-27 21:38 被阅读0次

本文译自Java read a file line by line – How Many Ways? 转载请注明出处。
Java中的I/O类非常多,什么时候该用什么类经常让人困惑。下面两段代码展示了如何一行一行的读取一个文件:
方法1:

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

方法2:

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

两种方法的不同之处是使用了不同的构造函数来构造BufferdReader,方法一使用了InputStreamReader而方法二使用了FileReader,两者有什么区别呢?
根据Java文档,“InputStreamReader是连接字节流和字符流的桥梁,它按字节读取并且按照设定的编码方式把字节解码。”InputStreamReader除了可以处理文件外,还可以处理其他输入流,比如网络连接,classpath resources,ZIP文件等等。
“FileReader是一个可以方便地读取字符文件的类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。”FileReader不允许你自己设定编码方式。因此,如果程序要运行在不同编码的系统上时,最好不要使用FileReader。
综上,相对于FileReader,InputStreamReader是一个更好的选择。
值得提及的是,在文件路径中不要使用/或者\,而是应该使用File.separator,这样可以确保程序在任何操作系统上都可以正确运行。同时应该使用相对路径,这样就确保了文件路径是决定正确的。
更新:
在Java 1.7中,你也可以使用下面的方法,其跟方法1是等价的。

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

阅读这些类的继承图也有助于理解这些inputstream和reader的关系:
http://www.programcreek.com/2012/05/java-io-class-hierarchy-diagram/

Reference: http://docs.oracle.com/javase/tutorial/essential/io/file.html

相关文章

  • Java中按行读取文件

    本文译自Java read a file line by line – How Many Ways? 转载请注明出...

  • Python IO 流

    转载请注明出处 读文件 读取整个文件 分段读取 按行读取代码 按行读取 二进制读取 写文件 文本写出 追加文件 二...

  • Java读取文件方法汇总

    这篇文章主要为大家详细介绍了Java读取文件方法,按字节读取文件内容、按字符读取文件内容、随机读取文件内容等,具有...

  • Java读取文件方法汇总

    这篇文章主要为大家详细介绍了Java读取文件方法,按字节读取文件内容、按字符读取文件内容、随机读取文件内容等,具有...

  • Java 快速按行读取文件

    起因:Java的IO总是很繁琐,而且需要你显式地处理IO抛出的异常,在一般的脚本化处理起来非常麻烦。每次仅仅是需要...

  • go实现按行读取文件

    go实现按行读取文件(附案例) 按行读取文件并筛选打印数据func ReadLineFile(fileName s...

  • shell按行读取文件

    在shell中按行读取文件常用的方法如下: file.txt文件中内容如下:

  • gradle文件操作

    读取文件,按行读取 写文件,如果文件不存在则创建,覆盖写

  • shell读取文件三种方法

    Shell按行读取文件的3种方法 Shell按行读取文件的方法有很多,常见的三种方法如下: 要读取的文件: 写法一...

  • 常用模块

    文件操作## 读取文件 可以使用with块缩短代码 分块读取 按行读取:如果要一次性读取所有行,只需调用readl...

网友评论

    本文标题:Java中按行读取文件

    本文链接:https://www.haomeiwen.com/subject/yihhxttx.html