关于java:将文件读入String的最简单方法是什么?

What is simplest way to read a file into String?

本问题已经有最佳答案,请猛点这里访问。

我正试图将一个简单的文本文件读入一个字符串。当然,有一种通常的方法可以获取输入流,并使用readline()进行迭代,然后将内容读取到字符串中。

在过去的数百次中,我只是想知道如何在最少的代码行中做到这一点?在Java中没有像EDOCX1,0…而是像这样简单的东西?

我知道有像ApacheCommonsIO这样的库提供了这样的简化,甚至我也可以编写一个简单的Util类来实现这一点。但我想知道的是,这是一个如此频繁的操作,每个人都需要,那么为什么Java不能提供这样简单的功能呢?是否真的有一个方法可以用某种默认或指定的编码将文件读取到字符串中?


是的,您可以在一行中做到这一点(不过对于健壮的IOException处理,您不想这样做)。

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

它使用一个java.util.Scanner,告诉它用\Z来限定输入,该输入是字符串锚的结尾。这最终使输入具有一个实际的标记,即整个文件,因此可以通过一次调用next()来读取它。

有一个构造函数接受一个File和一个String charSetName(以及许多其他重载)。这两个构造函数可以抛出FileNotFoundException,但像所有Scanner方法一样,不能将IOException抛出到这些构造函数之外。

如果发生或不发生IOException,可以通过ioException()方法查询Scanner本身。您还可能希望在阅读内容后显式地使用close()Scanner,因此最好将Scanner引用存储在局部变量中。

也见

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

相关问题

  • 使用java.util.scanner验证输入-有许多更典型的用法示例

第三方库选项

为了完整性,如果您有这些非常著名和非常有用的第三方库,那么这些是非常好的选择:

番石榴

com.google.common.io.Files包含许多有用的方法。相关的是:

  • String toString(File, Charset)
    • 使用给定的字符集,将文件中的所有字符读取到String中。
  • List readLines(File, Charset)
    • …将文件中的所有行读取到List中,每行一个条目

阿帕奇公地/IO

org.apache.commons.io.IOUtils也提供类似的功能:

  • String toString(InputStream, String encoding)
    • 使用指定的字符编码,获取InputStream的内容作为String的内容。
  • List readLines(InputStream, String encoding)
    • …作为String的(原始)List,每行一个条目

相关问题

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


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

new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);

其中filepath是表示要加载的文件的字符串。


您可以使用Apache Commons IO。

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

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


这应该对你有用:

1
2
3
4
5
6
7
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。

1
2
3
4
5
import org.apache.commons.io.FileUtils;

//...

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

有关方法的详细信息,请参阅de javadoc。


不要编写自己的Util类来实现这一点——我建议您使用充满各种优点的guava。在这种情况下,您需要Files类(如果您实际上只是在读取文件)或charstreams用于更通用的读取。它有方法将数据读取到字符串列表(readLines或全部(toString中)。

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

我同意在标准库中没有类似的东西是很烦人的。见鬼,只要能给FileReader提供一个CharSet,生活就会简单一点…


另一种替代方法是:

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

其他选项是使用开放源码库提供的实用程序
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/ioutils.html文件

为什么Java不提供这样一个通用的UTIL API?< BR>a)保持API通用,以便程序员处理编码、缓冲等。
b)让程序员做一些工作并编写/共享OpenSource Util库:d;-)


遗憾的是,没有。

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


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

解决方案是使用一个定界符,您可以确定该定界符不会出现在文件中。然而,理论上这是不可能的。我们所能做的是使用一个分隔符,它在文件中有一个很小的机会可以忽略不计:这样的定界符是一个uuID,它在Java中是本地支持的。

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