2017-09-30 2 views
0

Ich versuche, die Java 8 Stream-Funktion zu verstehen.ArrayStoreException beim Versuch, Dateien in Array über Files.walk zu sammeln

Ich möchte alle Dateien in einem Array (könnte als Liste sein) in allen Unterverzeichnissen eines bestimmten Verzeichnispfads abfangen.

Mein Code löst einen java.lang.ArrayStoreException Fehler

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

Eine andere Sache, die ich versuchte, nur die Dateinamen zu einem vorhandenen Arraylist hinzuzufügen:

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

Dies löst auch einen java.lang.ArrayStoreException Error aus.

Etwas anderes ich mit dem gleichen Ergebnis versucht wurde:

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

jemand mich in die richtige Richtung zeigen kann?

Die vollständige Stapelüberwachung ist:

Exception in thread "main" java.lang.ArrayStoreException bei java.lang.System.arraycopy (native Methode) bei java.util.stream.SpinedBuffer. copyInto (SpinedBuffer.java:198) um ​​ java.util.stream.Nodes $ SpinedNodeBuilder.copyInto (Nodes.java:1290) um java.util.stream.SinedBuffer.asArray (SpinedBuffer.java:215) um java. util.stream.Nodes $ SpinedNodeBuilder.asArray (Nodes.java:1296) um java.util.stream.ReferencePipeline.toArray (ReferencePipeline.java:439) um nachbearbeitung.CheckExistingMAIDs.main (CheckExistingMAIDs.java:41)

Vielen Dank im Voraus!

+0

können Sie den vollständigen Stack Trace teilen bitte? – Mureinik

+0

Mein schlechtes! Danke für den Tipp. Es ist ein java.lang.ArrayStoreException Error – Klaster

+1

Dies ist möglicherweise ein Duplikat von [Umgang mit einer ArrayStoreException] (https://stackoverflow.com/questions/12369957/dealing-with-an-arraystoreexception).Leider habe ich diesen Fehler vorher noch nie gesehen, also kann ich nicht darüber hinaus helfen. – Carcigenicate

Antwort

2

Ein ArrayStoreException ist nicht spezifisch für Java-Streams, ist es sehr alte Java-Ausnahme ist, was bedeutet, dass Sie ein Element eines inkompatiblen Typs in einem Array speichern möchten. In Ihrem Fall möchten Sie ein Array von File Objekten erstellen. Aber tatsächlich versuchen Sie, Path Objekte dort zu speichern, wie Files.walk produziert Stream<Path>, nicht Stream<File>. Um ein Path zu einem File konvertieren Sie Path.toFile Methode verwenden, kann es in der map Schritt Aufruf:

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

nur Dateinamen aufzulisten:

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

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

speichern können keine lokalen Variablen der Methode in einem Stream: .forEach(p -> existingNames.add(p.getFileName()));

Verwandte Themen