我正在尝试将简单的文本文件读入String。当然,通常的方法是获取输入流并使用readLine()进行迭代并将内容读入String。
过去已经完成了数百次,我只是想知道如何在最少的代码行中做到这一点?像String fileContents = XXX.readFile(myFile/*File*/)
这样的java中没有什么东西......而是看起来像这样简单的东西吗?
我知道像Apache Commons IO这样的库提供了这样的简化,甚至我可以编写一个简单的Util类来实现这一点。但我想知道的是 - 这是一个如此频繁的操作,每个人都需要为什么Java不提供这么简单的功能呢?是不是真的有一个方法可以使用某些默认或指定的编码将文件读入字符串?
答案 0 :(得分:340)
是的,您可以在一行中执行此操作(但需要执行您不希望的强大IOException
处理。)
String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);
这使用java.util.Scanner
,告诉它用\Z
分隔输入,这是字符串锚点的结尾。这最终使得输入具有一个实际令牌,即整个文件,因此可以通过一次调用next()
来读取它。
有a constructor需要File
和String charSetName
(以及其他许多重载)。这两个构造函数可能会抛出FileNotFoundException
,但与所有Scanner
方法一样,除了这些构造函数之外,不能抛出IOException
。
如果Scanner
发生了IOException
,您可以通过ioException()
方法查询Scanner
。您可能还希望在阅读内容后明确close()
Scanner
,因此最好将String
引用存储在本地变量中。
为了完整性,如果您拥有这些声誉卓着且非常有用的第三方库,这些是非常好的选择:
com.google.common.io.Files
包含许多有用的方法。这里的相关内容是:
String toString(File, Charset)
List<String>
List<String> readLines(File, Charset)
String toString(InputStream, String encoding)
,每行一个条目 org.apache.commons.io.IOUtils
也提供类似的功能:
InputStream
String
的内容作为List readLines(InputStream, String encoding)
List
String
的{原始){{1}},每行一个条目答案 1 :(得分:185)
从Java 7 (API Description)开始,您可以:
new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
其中filePath是表示要加载的文件的String。
答案 2 :(得分:42)
你可以使用apache commons IO ..
FileInputStream fisTargetFile = new FileInputStream(new File("test.txt"));
String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");
答案 3 :(得分:31)
这应该适合你:
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")));
}
答案 4 :(得分:21)
import org.apache.commons.io.FileUtils;
//...
String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8")
您可以查看de javadoc for the method了解详情。
答案 5 :(得分:10)
不要编写自己的util类来执行此操作 - 我建议使用Guava,它充满了各种善意。在这种情况下,您需要Files
类(如果您真的只是在阅读文件)或CharStreams以获得更多通用读数。它有方法将数据读入字符串列表(readLines
)或完全(toString
)。
它对二进制数据也有类似的有用方法。然后是图书馆的其他部分......
我同意令人讨厌的是,标准库中没有任何类似内容。哎呀,能够为CharSet
提供FileReader
会让生活更轻松 ......
答案 6 :(得分:7)
另一种替代方法是:
<强> How do I create a Java string from the contents of a file? 强>
其他选项是使用实用程序提供的开源库
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 :(得分:6)
可悲的是,没有。
我同意这种频繁操作应该比在循环中逐行复制输入更容易实现,但你必须编写辅助方法或使用外部库。
答案 8 :(得分:1)
我发现接受的答案实际上并不总是有效,因为\\Z
可能会出现在文件中。另一个问题是,如果你没有正确的字符集,可能会发生一大堆意想不到的事情,这可能导致扫描程序只读取文件的一部分。
解决方案是使用您确定永远不会在文件中出现的分隔符。但是,这在理论上是不可能的。我们可以做的是使用一个在文件中出现的可能性很小的分隔符,它可以忽略不计:这样的分隔符是UUID,在Java中本身支持。
String content = new Scanner(file, "UTF-8")
.useDelimiter(UUID.randomUUID().toString()).next();