【问题标题】:ArrayStoreException when trying to collect files into array via Files.walk尝试通过 Files.walk 将文件收集到数组中时出现 ArrayStoreException
【发布时间】:2018-03-12 04:36:27
【问题描述】:

我正在尝试了解 Java 8 流功能。

我想在特定目录路径的所有子目录中捕获一个数组(也可以是列表)中的所有文件。

我的代码抛出 java.lang.ArrayStoreException 错误

  File[] files = Files.walk(Paths.get(path))
      .filter(Files::isRegularFile)
      .toArray(File[]::new);

我尝试的另一件事是将文件名添加到现有的 ArrayList:

  ArrayList<String> existingNames = new ArrayList<String>();
  Files.walk(Paths.get(path))
      .filter(Files::isRegularFile)
      .forEach(p -> existingNames.add(p.getFileName()));

这也会引发 java.lang.ArrayStoreException 错误。

我尝试过的其他结果相同的是:

  File[] files = Files.walk(Paths.get(path))
      .filter(Files::isRegularFile)
      .toArray(File[]::new);

谁能指出我正确的方向?

完整的堆栈跟踪是:

线程“main”中的异常 java.lang.ArrayStoreException 位于 java.lang.System.arraycopy(本机方法)在 java.util.stream.SpinedBuffer.copyInto(SpinedBuffer.java:198) 在 java.util.stream.Nodes$SpinedNodeBuilder.copyInto(Nodes.java:1290) 在 java.util.stream.SpinedBuffer.asArray(SpinedBuffer.java:215) 在 java.util.stream.Nodes$SpinedNodeBuilder.asArray(Nodes.java:1296) 在 java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:439) 在 nachbearbeitung.CheckExistingMAIDs.main(CheckExistingMAIDs.java:41)

提前致谢!

【问题讨论】:

  • 你能分享完整的堆栈跟踪吗?
  • 我的错!感谢您的提示。这是一个 java.lang.ArrayStoreException 错误
  • 这可能与Dealing with an ArrayStoreException 重复。不幸的是,我以前从未见过这个错误,所以除了那个链接我无能为力。
  • 这里是 Files.walk 的文档:docs.oracle.com/javase/8/docs/api/java/nio/file/…。它返回一个 Stream。您正在尝试将这些路径存储到文件数组中。所以这行不通。香蕉装在香蕉盒里。鸡蛋装在蛋盒里。这里也一样。
  • 谢谢 JB。那成功了。从路径对象中,您可以获得文件名,但这仍然是路径对象。要获取字符串,您必须添加 .toString()。

标签: java-8 java-stream


【解决方案1】:

ArrayStoreException 并非特定于 Java 流,它是非常古老的 Java 异常,这意味着您希望将不兼容类型的元素存储在数组中。在您的情况下,您想创建一个 File 对象数组。但实际上您正试图将Path 对象存储在那里,因为Files.walk 产生Stream&lt;Path&gt;,而不是Stream&lt;File&gt;。要将Path 转换为File,您可以使用Path.toFile 方法在map 步骤中调用它:

File[] files = Files.walk(Paths.get("."))
        .filter(Files::isRegularFile)
        .map(Path::toFile)
        .toArray(File[]::new);

【讨论】:

    【解决方案2】:

    仅列出文件名:

    List<Path> pathList = Files.walk(Paths.get(path))
                               .filter(Files::isRegularFile)
                               .collect(Collectors.toList());
    
    pathList.forEach(p -> System.out.println(p.getFileName()));
    

    无法在 Stream 中存储方法的局部变量:.forEach(p -&gt; existingNames.add(p.getFileName()));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 2022-01-09
      • 1970-01-01
      • 2021-02-27
      • 2020-03-04
      • 2019-07-19
      • 1970-01-01
      相关资源
      最近更新 更多