本文译自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);

}

java 一行行读取文件_Java中按行读取文件相关推荐

  1. java中写入文件_java中创建、写入文件的5种方式

    在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. Files.newBufferedWriter(Java 8) Files. ...

  2. java在linux创建文件_Java中创建并写文件的5种方式

    导读 在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. 在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下 ...

  3. java filewriter写入文件_Java中的写入字符文件类FileWriter

    上一章中我们介绍字符读取文件的类FileReader,这一章我们介绍 FileWriter主要是以字符的方式写入文件中的类. import java.io.File; import java.io.F ...

  4. java实现保存合同模板_Java中常用到的文件操作那些事(一)——替换doc文档模板,生成真实合同案例...

    工作中,我们时常会遇到一些操作文件的操作,比如在线生成合同模板,上传/下载/解析Excel,doc文档转为pdf等操作.本文就已工作中遇到的在线生成合同为例,简要地介绍一种文档替换写法. 本文目的:给 ...

  5. java压缩zip文件夹错误_Java将文件或者文件夹压缩成zip(修复文件夹中存在多个文件报Stream Closed错误问题)...

    项目场景: Java将文件或者文件夹压缩成zip(修复文件夹中存在多个文件报Stream Closed错误问题) 问题描述: 最近的项目需要将多级文件夹压缩成zip,网上找了几个工具类,都会报错,所以 ...

  6. matlab打开bmp,Matlab 读取文件夹中所有的bmp文件

    将srcimg文件下的bmp文件转为jpg图像,存放在dstimg文件夹下 str = 'srcimg'; dst = 'dstimg'; file=dir([str,'\*.bmp']); :len ...

  7. python之从文件中按行读取数据

    #!/usr/bin/env python3 # -*- coding: utf-8 -*-__author__ = 'jiangwenwen'# 从文件中按行读取数据 file = open(&qu ...

  8. python pandas库读取excel/csv中指定行或列数据详解

    通过阅读表格,可以发现Pandas中提供了非常丰富的数据读写方法,下面这篇文章主要给大家介绍了关于python利用pandas库读取excel/csv中指定行或列数据的相关资料,需要的朋友可以参考下 ...

  9. linux 获取文件父目录权限,Linux 文件权限中,操作一个文件需要父目录的那些权限?...

    eudore:linux 文件权限中,操作一个文件需要父目录的那些权限? 是否需要检查每级目录?想找到一份完整规范正确的指导,自己在写检查 linux 用户文件权限的代码. 例如读取一个文件 /hom ...

最新文章

  1. SDWebImage使用——一个可管理远程图片加载的类库
  2. asp.net 中datagrid ItemDataBound\ItemCreated
  3. 基于RBAC模型的通用权限管理系统的设计(数据模型)的扩展
  4. Android之提示Could not find com.android.support:appcompat-v7:25.3.1.
  5. 大学计算机课的学后感,大学课程学习心得体会感想
  6. 2021-11-10如何快速部署Ceph分布式高可用集群
  7. 记一次Animator状态快速切换问题的解决
  8. 编译OpenJDK8:configure error /usr/lib64/ccache/gcc is a symbolic link to ccache
  9. git checkout切换分支
  10. 宗地图绘制要求和规范_宗地图绘制的基本要求和内容.ppt
  11. 网络安全常用的主流数据库(DBMS)✍
  12. CSP 201809-1 卖菜
  13. 虾皮物流怎么收费?收费标准是什么?
  14. 单链表上的直接插入排序
  15. 代码回现 | 如何实现交易反欺诈?
  16. 关于APP安装来源统计的分析
  17. LocalDate LocalDateTime Date 转换
  18. 学习笔记 md 文件的打开方法和MarkdownPad打开md文件时的问题解决
  19. 2022 ios APP最新开发测试教程
  20. 教你从头到尾利用DL学梵高作画 GTX 1070 cuda 8 0 tensorflow gpu版

热门文章

  1. 3、HTTP请求头与响应头
  2. 如何用计算机看dvd,电脑怎么播放dvd光盘_电脑无法播放dvd光盘
  3. 利用Java8新特性stream流给集合中的某个属性赋值
  4. tensoflow2.6训练自己的图像分类
  5. Pinterest风潮席卷中国互联网-是否重蹈团购潮悲剧?
  6. IDEA全屏代码后左侧有很多空白解决方法
  7. leetcode--给房子涂色III
  8. java实现商品sku_jquery实现商品sku多属性选择功能(商品详情页)
  9. 部落战争手游源码( 服务端+客户端+资源+开发文档)
  10. LeetCode 66:Plus One