使用 Java 8 在数组/列表中收集文件名 [重复]
Posted
技术标签:
【中文标题】使用 Java 8 在数组/列表中收集文件名 [重复]【英文标题】:Collecting file names in an array/list with Java 8 [duplicate] 【发布时间】:2020-02-28 17:56:55 【问题描述】:所以我在尝试收集特定文件夹中的所有文件名并将它们存储在数组 [] 或注释中的列表中时遇到了问题。
这是目前为止的代码:
String[] alist = new String[];
Files.list(Paths.get("mypath")).filter(Files::isRegularFile).forEach(System.out::println(alist);
或
String[] alist;
alist = Files.list(Paths.get("mypath")).filter(Files::isRegularFile).toArray(String[]::new);
或
Stream<String> alist = Stream.of(Files.list(Paths.get("path")).filter(Files::isRegularFile).toString());
String[] alist2 = alist.toArray(size -> new String[size]);
如您所见,我很难找出正确的方法。
目的是一旦我将所有文件名存储在一个数组中。然后我可以拆分数组中的每个字符串。然后创建一个从数组中的拆分字符串构建的 hashmap [key][name]。
几年后我才刚刚回到 Java 和 OOP,所以我有点生疏了。
感谢您的帮助!
【问题讨论】:
为什么要使用数组?使用List
更为常见。
我应该使用你是对的列表。要么/要么工作,只要它完成工作。我继续并更改了标题。
Java Stream API 有一些终端操作,例如forEach()
和collect()
。如果您需要一个列表,请使用Stream.of(...).filter(p->doSomething(p)).collect(Collectors.toList())
据我所知,您确实需要一个 HashMap。 java.util.stream.Collectors
有一些有用的收集器实现来创建列表或地图。
【参考方案1】:
正如@zforgo 所说,只需使用stream.map(for process each element)
并收集即可获得列表结果
List<String> filenames = Files.list(Paths.get("D:\\game\\Rayman1"))
.filter(Files::isRegularFile)
.map(p -> p.getFileName().toString())
.collect(Collectors.toList());
【讨论】:
虽然不完全相关,但我们不应该使用 try( Stream s = File.list() ) 来源:***.com/questions/38698182/close-java-8-stream,如果使用其他方式,可能会导致操作系统中打开文件句柄或泄漏【参考方案2】:尝试以下方法:
String[] fileNames = Arrays.stream(new File("dir").list().map(File::new)
.filter(File::isFile).map(File::getName).toArray(String[]::new);
for (String s : fileNames)
System.out.println(s);
或者你可以这样做。
try
String[] fileNames =
Files.list(Paths.get("dir")).filter(
Files::isRegularFile).map(
p -> p.toFile().getName()).toArray(String[]::new);
for (String s : fileNames)
System.out.println(s);
catch (Exception e)
e.printStackTrace();
【讨论】:
是否有特定原因你建议使用旧的麻烦的java文件io而不是NIOFiles
,Paths
,Path
?
"Files.list(..." 此代码打开一个流,但没有关闭它...以上是关于使用 Java 8 在数组/列表中收集文件名 [重复]的主要内容,如果未能解决你的问题,请参考以下文章