如何使用 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 语句放在
try
和 catch
块中,这会降低可读性。
List
是比数组更方便、更灵活的数据容器。如果您不处理需要数组的现有代码,请改用 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 语句放在
try
和catch
块中,这会降低可读性。 List
是比数组更方便、更灵活的数据容器。如果您不处理需要数组的现有代码,请改用List
。