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