Java:将文本文件内容打印到屏幕上

33

我有一个名为foo.txt的文本文件,其内容如下:

this

is

text

如何在Java 7中将此文件的内容精确打印到屏幕上?


2
听起来你需要从文件中读取文本。我可以向你保证,在Java中有很多关于从文件中读取的信息可以在网上找到... - Oliver Charlesworth
2
我告诉你!我无论如何都找不到这个!是的,我使用Google。 - user2151887
1
这个过去的问题正好有你要找的细节:https://dev59.com/YHE85IYBdhLWcg3waCxT。 - RouteMapper
1
@user2151887:所以你没试过这个吗?https://www.google.co.uk/search?q=java+read+file - Oliver Charlesworth
2
我告诉你!我在任何地方都找不到这个!是的,我用谷歌。我觉得很难相信。我见过的任何教材或通用教程都有关于文件I/O的部分。你甚至看了这个页面右侧提供给你的链接吗?我认为标题为“在Java中读取文本文件”的那个链接是一个好的起点。 - camickr
显示剩余2条评论
5个回答

51

Java 7之前:

 BufferedReader br = new BufferedReader(new FileReader("foo.txt"));
 String line;
 while ((line = br.readLine()) != null) {
   System.out.println(line);
 }
  • 添加异常处理
  • 添加关闭流的操作

自Java 7以来,不需要手动关闭流,因为它实现了autocloseable

try (BufferedReader br = new BufferedReader(new FileReader("foo.txt"))) {
   String line;
   while ((line = br.readLine()) != null) {
       System.out.println(line);
   }
}

1
但是编码怎么办呢?这段代码依赖于平台默认编码。 - kkhipis
1
好的,我想提供最简单的情况。如果您想显式指定编码,则可以使用new InputStreamReader(new FileInputStream(pathToFile), <encoding>),而不是FileReader - Jiri Kremser

23

为什么没有人觉得值得提到Scanner呢?

Scanner input = new Scanner(new File("foo.txt"));

while (input.hasNextLine())
{
   System.out.println(input.nextLine());
}

3
因为问题涉及Java,所以代码可能会过于冗长,难以阅读(你问了这个问题!)。如果你还没有尝试过Groovy(与Java语法兼容且运行在JVM上),我敢打赌你会喜欢它。 - Dem Pilafian

3

这里的每个示例都展示了使用FileReader的解决方案。如果您不需要关心文件编码,那么这很方便。如果您使用的是英语以外的其他语言,则编码非常重要。想象一下,您有一个包含此文本的文件:

Příliš žluťoučký kůň
úpěl ďábelské ódy

该文件使用windows-1250格式。如果您使用FileReader,则会得到以下结果:

P��li� �lu�ou�k� k��
�p�l ��belsk� �dy

所以在这种情况下,您需要指定编码为Cp1250(Windows东欧语言),但FileReader不允许您这样做。在这种情况下,您应该在FileInputStream上使用InputStreamReader。

示例:

String encoding = "Cp1250";
File file = new File("foo.txt");

if (file.exists()) {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding))) {
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
else {
    System.out.println("file doesn't exist");
}

如果您想逐个字符读取文件,请不要使用BufferedReader。

try (InputStreamReader isr = new InputStreamReader(new FileInputStream(file), encoding)) {
    int data = isr.read();
    while (data != -1) {
        System.out.print((char) data);
        data = isr.read();
    }
} catch (IOException e) {
    e.printStackTrace();
}

2

使用Java 7的try-with-resources语法,可以对Jiri的答案进行改进:

try (BufferedReader br = new BufferedReader(new FileReader("foo.txt"))) {
   String line = null;
   while ((line = br.readLine()) != null) {
       System.out.println(line);
   }
}

在您选择的位置添加异常处理,可以在此 try 中或其他地方。

2

对于那些刚接触Java并想知道为什么Jiri的答案不起作用的人,请确保按照他所说的处理异常,否则它将无法编译。以下是最基本的处理方式:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile {

    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("test.txt"));
        for (String line; (line = br.readLine()) != null;) {
            System.out.print(line);
        }
        br.close()
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接