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

Gop*_*opi 256 java file-io file

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

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

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

pol*_*nts 350

是的,你可以在一行中做到这一点(尽管IOException你不想要强大的处理).

String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);
Run Code Online (Sandbox Code Playgroud)

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

一个构造函数接受a File和a String 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)
    • ...作为一个(原始)ListString每行,一个条目

相关问题

  • 不幸的是,Scanner解决方案因空文件而失败(NoSuchElementException) (7认同)
  • 返回新的Scanner(新URL(url).openStream(),"UTF-8").useDelimiter("\\ A").next(); 更好,因为它不会在空文件上失败. (7认同)
  • 另请参阅下面的解决方案,了解Java 7机制,它基本上是默认API的一行,就像Java在这个问题上稍微改进了很多东西一样. (2认同)
  • 我已经使用了一段时间,但事实证明它并不总是有效!有时`\\ Z`实际上会出现在文件中并导致失败. (2认同)
  • 如果您使用的文本文件大于1024字节,请避免这种情况.扫描仪将(至少在Android上)将生成的字符串切割为1024字节. (2认同)

Jim*_*Jim 190

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

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

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

  • @Paul我认为这是默认的.在构造新String时,始终可以指定charset (6认同)
  • 我相信这只有在文件位于平台的默认字符集中时才有效. (2认同)
  • 该解决方案的缺点是不能使用类路径资源(通过`Class.getResource()` 或类似方法获得),而`Scanner` 解决方案在这种情况下确实有效。 (2认同)
  • 我上一条评论的纯 Java 版本: String iAmAString = new String(Files.readAllBytes(new File(Thread.currentThread().getContextClassLoader().getResource("iAmAFile").toURI()).toPath())); (2认同)
  • @Rondo并非所有类路径资源都对应于“文件”(例如,考虑一下 jar 内的资源),所以不,它通常不能用于此目的。 (2认同)
  • 从 Java 11 开始:`String s = Files.readString(Paths.get(filePath))` (2认同)

Rak*_*yal 42

你可以使用apache commons IO ..

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

String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

  • 什么是Java程序员,并且当Java内置工作正常时,总是尝试使用第三方库. (13认同)
  • 当然,那些设施"工作得很好",只是其中一些设施完全过于复杂.我同意,仅仅为此使用另一个lib有点矫枉过正. (4认同)
  • 这不是矫枉过正.这是一个机会.有机会开始使用apache公共库并提高工作效率.或者你可以选择番石榴. (3认同)

小智 33

这应该适合你:

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")));
}
Run Code Online (Sandbox Code Playgroud)


cju*_*gel 23

使用Apache Commons IO.

import org.apache.commons.io.FileUtils;

//...

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

您可以在详细信息中查看de javadoc方法.


Jon*_*eet 10

不要编写自己的util类来做到这一点 - 我建议使用Guava,它充满了各种各样的善良.在这种情况下,您需要Files该类(如果您真的只是在阅读文件)或CharStreams以进行更通用的阅读.它具有将数据读入字符串(readLines)或完整(toString)列表的方法.

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

我同意令人讨厌的是,标准库中没有类似的东西.哎呀,只能够供应CharSetFileReader将让生活有点简单...

  • @Manu:我绝对不会使用它 - 我至少会指定一个字符编码.但是,由于Guava通常是有用的(即使使用Java 8),你也可以使用`Files.toString`,因为它有多么简单...... (2认同)

小智 7

另一种替代方法是:

如何从文件内容创建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 ;-)


Nik*_*bak 6

可悲的是没有.

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