IT-Swarm.Net

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

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

在过去做过数百次之后,我只是想知道如何在最少的代码行中做到这一点? Java中没有像String fileContents = XXX.readFile(myFile/*File*/)这样的东西......而是看起来像这样简单的东西吗?

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

247
Gopi

是的,您可以在一行中执行此操作(尽管您不希望执行强大的IOException处理)。

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

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

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

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

也可以看看

相关问题


第三方库选项

为了完整性,如果您拥有这些非常有信誉且非常有用的第三方库,这些是非常好的选择:

番石榴

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

Apache Commons/IO

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

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

相关问题

340
polygenelubricants

从Java 7 (API描述) 之后你可以这样做:

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

其中filePath是表示要加载的文件的String。

185
Jim

你可以使用Apache commons IO ..

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

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

这应该适合你:

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")));
}
31
DDas

使用 Apache Commons IO

import org.Apache.commons.io.FileUtils;

//...

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

您可以看到方法的de javadoc 详细信息。

21
cjungel

不要编写自己的util类来执行此操作 - 我建议使用 Guava ,它充满了各种各样的善良。在这种情况下,您需要 Files 类(如果您实际上只是在读取文件)或 CharStreams 用于更多通用读取。它具有将数据读入字符串列表(readLines)或完全(toString)的方法。

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

我同意令人讨厌的是,标准库中没有类似的东西。哎呀,只要能够为CharSet提供一个FileReader,就可以使生命变得有点更简单......

10
Jon Skeet

另一种替代方法是:

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

其他选择是使用实用程序提供的开源库
http://commons.Apache.org/io/api-1.4/index.html?org/Apache/commons/io/IOUtils.html

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

7
Bhuvan Gupta

可悲的是没有。

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

6
Nikita Rybak

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

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

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