我试图将一个简单的文本文件读入字符串。当然,通常有获取输入流并使用readLine()迭代并将内容读入String的方法。

在过去做了数百次之后,我只是想知道如何用最少的代码行来完成这个任务?java中没有类似String fileContents = XXX.readFile(myFile/*File*/) ..而是像这样简单的东西?

我知道有像Apache Commons IO这样的库可以提供这样的简化,甚至我可以写一个简单的Util类来做这件事。但我想知道的是——这是一个如此频繁的操作,每个人都需要,那么为什么Java不提供这样简单的函数?难道真的没有一个方法可以将文件读入具有默认或指定编码的字符串吗?


很遗憾,没有。

我同意这样频繁的操作应该比在循环中逐行复制输入更容易实现,但您必须要么编写helper方法,要么使用外部库。


不要写你自己的util类来做这件事——我建议使用Guava,它充满了各种各样的好处。在这种情况下,你需要Files类(如果你真的只是读取一个文件)或CharStreams来进行更通用的读取。它具有将数据读入字符串列表(readLines)或totally (toString)的方法。

它对二进制数据也有类似的有用方法。然后还有图书馆的其他部分……

我同意在标准库中没有类似的东西是令人恼火的。见鬼,只要能够为FileReader提供一个CharSet,就会让生活变得简单一些……


另一种替代方法是:

如何从文件的内容创建Java字符串?

另一种选择是使用开放源码库提供的实用程序 http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html

为什么java不提供这样一个通用的util API ? a)保持api的通用性,以便编码、缓冲等由程序员处理。 b)让程序员做一些工作,编写/共享开源util库:D;-)


你可以使用apache commons IO..

FileInputStream fisTargetFile = new FileInputStream(new File("test.txt"));

String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");

是的,您可以在一行中完成(尽管对于健壮的IOException处理,您不希望这样做)。

String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);

这使用java.util。扫描器,告诉它用\Z分隔输入,这是字符串锚的结束。这最终使输入有一个实际的令牌,即整个文件,因此可以通过调用next()读取它。

有一个构造函数接受一个File和一个String charSetName(在许多其他重载中)。这两个构造函数可能会抛出FileNotFoundException,但是像所有的Scanner方法一样,除了这些构造函数之外,不能抛出IOException。

你可以通过ioException()方法查询扫描器本身是否发生ioException。您可能还希望在读取内容后显式地关闭()Scanner,因此可能将Scanner引用存储在局部变量中是最好的。

另请参阅

Java教程- I/O要点-扫描和格式化

相关问题

使用java.util.Scanner验证输入——有许多更典型的用法示例


第三方库选项

为了完整起见,如果你有这些非常有信誉和非常有用的第三方库,这些是非常好的选择:

番石榴

files包含许多有用的方法。相关的有:

字符串toString(文件,字符集) 使用给定的字符集,将文件中的所有字符读入String List<String> readLines(File, Charset) ... 将文件中的所有行读入List<String>,每行一项

Apache Commons / 1

ioutils也提供类似的功能:

String toString(输入流,字符串编码) 使用指定的字符编码,以字符串形式获取InputStream的内容 列出readLines(输入流,字符串编码) ... 作为字符串的(原始)列表,每行一个条目

相关问题

最有用的免费第三方Java库(已删除)?


从Java 7 (API描述)开始,你可以做:

新字符集(文件.readAllBytes(Paths.get(filePath),默认文件.UTF_8);

其中filePath是一个字符串,表示您要加载的文件。


我发现接受的答案实际上并不总是有效,因为\\Z可能出现在文件中。另一个问题是,如果你没有正确的字符集,一大堆意想不到的事情可能会发生,这可能会导致扫描器只读取文件的一部分。

解决方案是使用您确定永远不会在文件中出现的分隔符。然而,这在理论上是不可能的。我们能做的是使用一个在文件中出现的几率很小的分隔符,可以忽略不计:这样的分隔符是一个UUID,它在Java中是原生支持的。

String content = new Scanner(file, "UTF-8")
    .useDelimiter(UUID.randomUUID().toString()).next();

这应该对你有用:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public static void main(String[] args) throws IOException {
    String content = new String(Files.readAllBytes(Paths.get("abc.java")));
}

使用Apache Commons IO。

import org.apache.commons.io.FileUtils;

//...

String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8")

您可以在de javadoc中查看该方法的详细信息。