如何使用 Files.list() 获取字符串数组

How to get String array using Files.list()

我有一个包含字符串的 txt 文件

我想通过 Files.list(Paths.get("path")) 方法获取包含文件中所有行的 String 数组。

我尝试使用 toArray() 但它 returns 一个 路径数组 到“路径”目录

中的文件

如何使用 Files.list(Paths.get("path")) 获取它(必须)?

我有这样的东西:

public Object[] returnStrings(){
    Object[] strings;
    try {
        strings = Files.list(Paths.get(path)).toArray();
    }catch (IOException ex){
        return null;
    }
    return strings;
}

Files.list() 需要一个指向 目录 path 作为参数,它会给你一个 [=此目录中包含 Path 个对象(如果有)的 48=]stream。如果给定的 path 将是 file,您将得到 NotDirectoryException 异常。您无法使用 Files.list() 访问文件 的 内容,它只是用于其他目的。

为了从文本文件读取,您可以使用Files.lines() or Files.readAllLines().

与将所有文件内容转储到内存中的 Files.readAllLines() 相反,Files.lines() 生成的流将被延迟填充。因此,在一般情况下 Files.lines() 一种从文件读取的首选方式,尤其是当您不知道它的大小时。

对于此任务,即使所有文件的内容都必须在内存中分配(即在这种情况下,上面提到的 upper-hand 流的惰性并不重要), Files.lines() 是更好的选择,因为预期结果需要是一个 字符串数组 。作为流管道执行的结果,生成 array 比将文件读入 list 更高效,更 space-efficient (which readAllLines() returns) 然后根据这个列表创建一个字符串数组。

使用 Files.lines() 可以这样实现:

public static String[] readFromFile(Path path) {
    String[] result;
    try(Stream<String> stream = Files.lines(path)) {
        result = stream.toArray(String[]::new);
    } catch (IOException e) {
        result = new String[0];
    }
    return result;
}

您的代码中有几个重要问题

  • 您没有关闭资源。因为流正在访问文件,所以它必须在 finally 块内显式关闭或使用 try with resources 关闭,如上所示(首选且更简洁的方式)。
  • String 存储在 Object 的数组中不是一个好主意,因为除了打印它们之外,为了对这些字符串执行任何操作,您将不得不进行不安全的类型转换。
  • 如果尝试从文件读取失败,return null 不是很好。因为 null 之后可能会导致问题,因为它的来源不明显。

最后,一些建议

  • 避免将 return 语句放在 trycatch 块中,这会降低可读性。
  • List 是比数组更方便、更灵活的数据容器。如果您不处理需要数组的现有代码,请改用 List