尝试通过Files.walk将文件收集到数组时出现ArrayStoreException

时间:2017-09-30 12:59:00

标签: java-8 java-stream

我正在尝试理解Java 8 Stream-feature。

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

我的代码抛出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);

有人能指出我正确的方向吗?

完整堆栈跟踪是:

  

线程中的异常&#34; main&#34; java.lang.ArrayStoreException at   java.lang.System.arraycopy(Native Method)at   java.util.stream.SpinedBuffer.copyInto(SpinedBuffer.java:198)at at   java.util.stream.Nodes $ SpinedNodeBuilder.copyInto(Nodes.java:1290)at at   java.util.stream.SpinedBuffer.asArray(SpinedBuffer.java:215)at at   java.util.stream.Nodes $ SpinedNodeBuilder.asArray(Nodes.java:1296)at at   java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:439)     在   nachbearbeitung.CheckExistingMAIDs.main(CheckExistingMAIDs.java:41)

提前致谢!

2 个答案:

答案 0 :(得分:5)

ArrayStoreException并非特定于Java流,它是非常古老的Java Exception,这意味着您希望在数组中存储不兼容类型的元素。在您的情况下,您想要创建一个File个对象的数组。但实际上您正在尝试在Path处存储Files.walk个对象,因为Stream<Path>生成Stream<File>,而不是Path。要将File转换为Path.toFile,您可以使用map方法在File[] files = Files.walk(Paths.get(".")) .filter(Files::isRegularFile) .map(Path::toFile) .toArray(File[]::new); 步骤中调用它:

Function FunctionName(str)

    Dim resultStr
    Dim wordArr
    wordArr = Array(Split(str, "_"))

    For Each item In wordArr
        resultStr = resultStr & UppercaseFirstLetter(item)
    Next item

    FunctionName = resultStr

End Function 'FunctionName

答案 1 :(得分:2)

仅列出文件名:

List<Path> pathList = Files.walk(Paths.get(path))
                           .filter(Files::isRegularFile)
                           .collect(Collectors.toList());

pathList.forEach(p -> System.out.println(p.getFileName()));

无法在流中存储方法的本地变量:.forEach(p -> existingNames.add(p.getFileName()));