如何从文件内容创建一个Java字符串?
如何从文件内容创建一个Java字符串?
我已经使用下面的习语一段时间了。至少在我访问过的网站上,它似乎是最为广泛使用的。
在Java中读取文件到字符串中是否有更好/不同的方法?
private String readFile(String file) throws IOException { BufferedReader reader = new BufferedReader(new FileReader (file)); String line = null; StringBuilder stringBuilder = new StringBuilder(); String ls = System.getProperty("line.separator"); try { while((line = reader.readLine()) != null) { stringBuilder.append(line); stringBuilder.append(ls); } return stringBuilder.toString(); } finally { reader.close(); } }
读取文件中的所有文本
Java 11添加了 readString() 方法,可以将小文件读取为一个 String
,同时保留行终止符:
String content = Files.readString(path, encoding);
对于Java 7到11之间的版本,这里有一个紧凑且健壮的习语,封装在一个实用方法中:
static String readFile(String path, Charset encoding) throws IOException { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, encoding); }
从文件中读取文本行
Java 7添加了一个方便的方法,将文件读取为文本行,表示为一个 List
。这种方法是"有损"的,因为行分隔符会被从每行末尾剥离。
Listlines = Files.readAllLines(Paths.get(path), encoding);
Java 8添加了 Files.lines()
方法来生成一个 Stream
。同样,这种方法是有损的,因为会剥离行分隔符。如果在读取文件时遇到 IOException
,它将被包装在一个 UncheckedIOException
中,因为 Stream
不接受抛出受检异常的 lambda。
try (Streamlines = Files.lines(path, encoding)) { lines.forEach(System.out::println); }
这个 Stream
需要调用 close()
方法;这在API上的文档说明很差,我怀疑许多人甚至没有注意到 Stream
有一个 close()
方法。确保使用如下的 ARM 块。
如果你正在使用的源不是一个文件,你可以使用 BufferedReader
中的 lines()
方法。
内存利用
如果相对于可用内存,你的文件足够小,一次性读取整个文件可能会很好。然而,如果你的文件太大,逐行读取、处理并在继续下一行之前丢弃它可能是更好的方法。以这种方式进行流处理可以消除文件大小作为内存需求因素的影响。
字符编码
原始帖子中样例缺少的一个要素是字符编码。这种编码通常无法从文件本身中确定,并需要元数据,如 HTTP 头来传递这些重要信息。
StandardCharsets
类定义了所有Java运行时所需的编码的一些常量:
String content = readFile("test.txt", StandardCharsets.UTF_8);
平台默认编码可从Charset
类本身中获得:
String content = readFile("test.txt", Charset.defaultCharset());
有一些特殊情况下,平台默认编码可能是你想要的,但它们很少出现。你应该能够证明你的选择,因为平台默认编码是不可移植的。一个可能是正确的例子是读取标准输入或写入标准输出。
注意: 这个答案在很大程度上取代了我Java 6版本的答案。Java 7的实用程序简化了代码,并且旧的答案使用了映射的字节缓冲区,防止被读取的文件在映射的缓冲区被垃圾收集之前被删除。您可以通过此答案上的“编辑”链接查看旧版本。