java 一行行读取文件_Java中按行读取文件

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

}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Java程序,可以从一个文本文件取数据并统计每个单词出现的次数: ```java import java.io.BufferedReader; import java.io.FileReader; import java.util.HashMap; import java.util.Map; public class WordCount { public static void main(String[] args) { String fileName = "input.txt"; // 输入文件名 Map<String, Integer> wordCountMap = new HashMap<>(); // 用于存储每个单词的出现次数 try { BufferedReader reader = new BufferedReader(new FileReader(fileName)); String line; while ((line = reader.readLine()) != null) { // 逐行取数据 String[] words = line.split("\\s+"); // 将每行数据按空格分割成单词数组 for (String word : words) { if (!wordCountMap.containsKey(word)) { wordCountMap.put(word, 1); // 如果单词第一次出现,将其加入map,并将其出现次数设为1 } else { int count = wordCountMap.get(word); wordCountMap.put(word, count + 1); // 如果单词已经出现过,将其出现次数加1 } } } reader.close(); } catch (Exception e) { e.printStackTrace(); } // 输出每个单词的出现次数 for (String word : wordCountMap.keySet()) { int count = wordCountMap.get(word); System.out.println(word + ": " + count); } } } ``` 在上述程序,我们首先定义了一个`wordCountMap`,用于存储每个单词的出现次数。然后,我们使用`BufferedReader`类从指定的文件逐行取数据,并将每行数据按空格分割成单词数组。接着,我们遍历每个单词,如果它是第一次出现,则将其加入`wordCountMap`,并将其出现次数设为1;否则,我们从`wordCountMap`取出该单词的出现次数,并将其加1。最后,我们遍历`wordCountMap`,输出每个单词的出现次数。 需要注意的是,在本程序,我们使用了正则表达式`\s+`将每行数据按空格分割成单词数组。这里的`\s`表示任意的空白字符,包括空格、制表符、换行符等。`\s+`表示一个或多个空白字符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值