2017-01-02 1 views
3

Mein Ziel ist zu überprüfen, ob eine Datei mit einem bestimmten (Teil des Namens) in einem Ordner im Netzwerk gefunden wird, auch unter Berücksichtigung aller Ordner darunter. Um dies zu tun, brauche ich eine Möglichkeit, um eine Liste aller Dateien und Ordner in und unter einem bestimmten Ordner zu erhalten. Meine rekursive Funktion führt ~ 2500 Objekte/s auf einem lokalen Laufwerk, aber nur einige/Sek auf einem Netzlaufwerk. Ich brauche etwas schneller.Wie benutzt man java.nio in Matlab?

Die Kernfrage ist: Was ist der schnellste Weg, um eine Liste von Elementen in einem Ordner einschließlich des Attributs isDirectory oder etwas ähnliches zu erhalten?

Ich habe meine Hoffnung auf die WalkFileTree-Funktionalität von java.nio, aber ich kann es nicht verwenden. (Version: 8.4.0.150421 (R2014b) mit Java 1.7.0_11-b21 mit Oracle Corporation Java HotSpot ™ 64-Bit Server VM Mischbetrieb)

Aktuelle Problem: Ich kann keine Funktionalität von java.nio verwenden

java.io funktioniert, z Erstellen Sie eine Datei Objekt:

jFile = java.io.File('C:\') 
% then use jFile.list or jFile.isDirectory or jFile.toPath, it all works! 

Naiv Aufruf nio fehlschlägt:

java.nio.file.Files('C:\') 
% -> No constructor 'java.nio.file.Files' with matching signature found. 

Ich weiß, java.nio.file ein wenig anders funktioniert, ist die Methoden in Dateien zu verwenden, ein Weg benötigt, die sein kann erstellt mit java.nio.file.Path.get. Dieses Ding isst eine Schnur. Aber dies nicht gelingt auch:

java.nio.file.Paths.get('C:\') % -> No method 'get' with matching signature found for class 'java.nio.file.Paths'. 

jedoch das Verfahren besteht:

methods java.nio.file.Paths 
% -> Methods for class java.nio.file.Paths: 
equals  getClass notify  toString 
get  hashCode notifyAll wait 

Also, was falsch ist hier los? Ich darf keine Matlab-Saite füttern? Sollte ich eine Java-Zeichenfolge verwenden? Auch dies fehlschlägt:

jString = java.lang.String('C:\'); 
java.nio.file.Paths.get(jString) 
% -> No method 'get' with matching signature found for class 'java.nio.file.Paths'. 

Ein Orakel Abhilfe ist, den Weg in java.io zu schaffen, aber Fütterung, dass auch java.nio versagt ..

path = java.io.File('C:\').toPath; 
java.nio.file.Files.isDirectory(path) 
% -> No method 'isDirectory' with matching signature found for class 'java.nio.file.Files'. 

Also ich nicht näher bin immer zu sogar den WalkFileTree ausprobieren. Ich kann java.nio nicht dazu bringen, irgendetwas in Matlab zu tun.

Hilfe: Hat jemand eine Idee, wie man die Funktionen von java.nio.file aufruft oder meine Kernfrage beantwortet?

ps: Beispiele für einfache Methoden bisher ohne java.nio, Beispiele tun nicht umfassen die rekursive Teil zeigen aber die schreckliche Leistung

Strategie 1: rekursiv Matlab ‚dir‘ Funktion verwenden. Es ist eine nette Funktion, da es auch Attribute gibt, aber es ist ein bisschen langsam. In meinem Ausgangsnetzwerkordner (enthält 150 Dateien/Ordner, Pfad als String sDir gespeichert) den folgenden Befehl nimmt 34,088842 sec:

tic;d=dir(Sdir);toc 

Strategie 2: java.io.File verwenden, um Dinge zu beschleunigen, dies kaum hilft, da isDirectory aufgerufen werden muss. Die Verwendung einer Heuristik für die Namen der Elemente ist zu gefährlich, ich bin gezwungen, Ordner mit Punkten zu verwenden. Beispiel in demselben Verzeichnis, 31.315.587 sec:

tic;jFiles = java.io.File(Sdir).listFiles; 
LCVdir = arrayfun(@isDirectory, jFiles, 'UniformOutput',0); 
toc 

Antwort

2

Diese java.nio.file Methoden haben variadic signatures. Es sieht so aus, als ob Matlab nicht in der Lage ist, das automatische Boxing auszuführen, das benötigt wird, damit sie transparent arbeiten. Daher müssen Sie sie mit der Array-Form ihrer Argumente aufrufen.

Die Signatur für java.nio.file.Paths.get ist get(String first, String... more). Dies entspricht get(String first, String[] more).

>> java.nio.file.Paths.get('C:\', javaArray('java.lang.String', 0)) 
ans = 
C:\ 
>> class(ans) 
ans = 
sun.nio.fs.UnixPath 

Ähnlich ist die Signatur für java.nio.file.Files.isDirectoryisDirectory(Path path, LinkOption... options), so müssen Sie das options Argument liefern.

>> p = java.nio.file.Paths.get('/usr/local', javaArray('java.lang.String', 0)); 
>> java.nio.file.Files.isDirectory(p, javaArray('java.nio.file.LinkOption', 0)) 
ans = 
    logical 
    1 
>> 

BTW, die Files.walkFileTree Methode erfordert, dass Sie eine benutzerdefinierte java.nio.file.FileVisitor Unterklasse zu implementieren, die Sie benötigen, um in Java, nicht schlicht Matlab zu tun.

Da Sie sich auf einem Netzwerklaufwerk befinden, könnte die Netzwerkdatei-I/O hier sogar Ihr Engpass sein. Sie sollten also Ihre Erwartungen nicht zu hoch setzen, damit die Java NIO-Lösung viel schneller ist. Um dies wirklich schnell zu machen, muss das Traversal auf einer Maschine ausgeführt werden, die schnellen Zugriff auf die Dateisystemdaten hat, oder noch besser, etwas, das sie für eine effiziente Suche indiziert hat.