如何从文件内容创建一个Java字符串?

57 浏览
0 Comments

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

读取文件中的所有文本

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。这种方法是"有损"的,因为行分隔符会被从每行末尾剥离。

List lines = Files.readAllLines(Paths.get(path), encoding);

Java 8添加了 Files.lines() 方法来生成一个 Stream。同样,这种方法是有损的,因为会剥离行分隔符。如果在读取文件时遇到 IOException,它将被包装在一个 UncheckedIOException 中,因为 Stream 不接受抛出受检异常的 lambda。

try (Stream lines = 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的实用程序简化了代码,并且旧的答案使用了映射的字节缓冲区,防止被读取的文件在映射的缓冲区被垃圾收集之前被删除。您可以通过此答案上的“编辑”链接查看旧版本。

0