Java 将文件读入字符串的最简单方法是什么?

Java 将文件读入字符串的最简单方法是什么?,java,file,file-io,Java,File,File Io,我正在尝试将一个简单的文本文件读入字符串。当然,获取输入流、使用readLine()进行迭代以及将内容读入字符串的通常方法也是存在的 在过去已经做了数百次了,我只是想知道如何用最少的代码行来做这件事?java中没有类似于stringfilecontents=XXX.readFile(myFile/*File*/)的东西吗。。而不是像这样简单的东西 我知道有像ApacheCommonsIO这样的库提供了这样的简化,甚至我可以编写一个简单的Util类来实现这一点。但我想知道的是——这是一个如此频繁的

我正在尝试将一个简单的文本文件读入字符串。当然,获取输入流、使用readLine()进行迭代以及将内容读入字符串的通常方法也是存在的

在过去已经做了数百次了,我只是想知道如何用最少的代码行来做这件事?java中没有类似于
stringfilecontents=XXX.readFile(myFile/*File*/)
的东西吗。。而不是像这样简单的东西

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

不幸的是,没有


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

不要编写您自己的util类来完成这一点-我建议使用,它有各种优点。在这种情况下,您可能需要类(如果您真的只是在读取文件)或更通用的读取。它具有将数据读入字符串列表(
readLines
)或全部(
toString
)的方法

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


我同意标准库中没有类似的东西是令人恼火的。见鬼,只要能够向
文件阅读器提供
字符集
,生活就会简单一些。

另一种替代方法是:

另一种选择是使用开放源码库提供的实用程序

为什么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
处理,您可能不想这样做)

它使用一个,告诉它用
\Z
分隔输入,这是字符串锚点的结尾。这最终会使输入有一个实际的标记,即整个文件,因此只需调用
next()
即可读取

还有一种方法采用
文件
字符串charSetName
(以及许多其他重载)。这两个构造函数可以抛出
FileNotFoundException
,但与所有
Scanner
方法一样,不能在这些构造函数之外抛出任何
IOException

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

另见
相关问题
  • -有许多更典型的用法示例

第三方库选项 为了完整起见,如果您有这些非常著名且非常有用的第三方库,那么以下是一些非常好的选择:

包含许多有用的方法。有关的建议如下:

    • 使用给定的字符集,将文件中的所有字符读入
      字符串
    • 。。。将文件中的所有行读入
      列表
      ,每行一个条目
还提供类似的功能:

  • String-to字符串(输入流,字符串编码)
    • 使用指定的字符编码,将
      InputStream
      的内容作为
      字符串
  • 列出读取行(输入流、字符串编码)
    • 。。。作为
      字符串的(原始)
      列表
      ,每行一个条目
相关问题
从Java 7开始,您可以执行以下操作:

新字符串(Files.readAllBytes(path.get(filePath)),StandardCharsets.UTF_8)


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

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

解决方案是使用一个您确信永远不会在文件中出现的分隔符。然而,这在理论上是不可能的。我们可以做的是,使用一个分隔符,它在文件中出现的几率很小,可以忽略不计:这样的分隔符是一个,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")));
}
使用


有关详细信息,请参见de。

请参见下面的Java 7机制解决方案,该解决方案基本上与默认API是一行的,正如Java自提出此问题以来所做的许多事情一样。不幸的是,Scanner解决方案因空文件而失败(NoSuchElementException),我已经使用了一段时间,但事实证明它并不总是有效的!有时,
\\Z
会在文件中实际出现并导致失败。返回新的扫描程序(新的URL(URL).openStream(),“UTF-8”)。使用分隔符(\\A”).next();最好是在空文件上不会失败。如果您使用的文本文件大于1024字节,请避免这种情况。扫描器将(至少在Android上)将生成的字符串剪切为1024字节。我相信只有当文件在平台的默认字符集中时,这才有效。@Paul我认为这是默认设置。在构造此解决方案的新字符串时,始终可以指定字符集
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")));
}
import org.apache.commons.io.FileUtils;

//...

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