2017-01-02 67 views
3

我的目標用於檢查是否在網絡上的文件夾中找到具有特定(名稱的一部分)的文件,同時也考慮到它下面的所有文件夾。爲此,我需要一種方法來高效地獲取給定文件夾中和下面的所有文件和文件夾的列表。我的遞歸函數在本地驅動器上約2500項/秒,但在網絡驅動器上只有幾個/秒。我需要更快的東西。如何在Matlab中使用java.nio?

核心問題是:什麼是最快的方式來獲取文件夾中的項目列表,包括屬性isDirectory或類似的東西?

我把希望寄託在java.nio的walkFileTree功能上,但我無法使用它。 (版本:8.4.0.150421(R2014b)與Java 1.7.0_11-b21的與Oracle公司的Java HotSpot的™64位服務器VM混合模式)

當前的問題:我無法從java.nio中使用任何功能

java.io有效,例如創建一個文件對象:

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

天真調用NIO失敗:

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

我意識到java.nio.file作品有點不同,使用的文件的方法需要一個路徑,它可以是用java.nio.file.Path.get構造。這東西吃一個字符串。但是,這也失敗:

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

但是該方法存在:

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

那麼什麼錯在這裏?我不允許喂一個matlab字符串?我應該使用Java字符串嗎?這也失敗了:

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

的甲骨文解決辦法是建立在java.io的路徑,而是餵養到java.nio中也失敗..

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'. 

所以我沒有得到任何接近甚至嘗試walkFileTree。我無法獲得java.nio在Matlab中執行任何操作。

幫助:那麼有沒有人有任何想法如何調用java.nio.file函數或回答我的核心問題?

PS:至今沒有java.nio中的簡單的方法的例子,例子做不包括遞歸部分,但顯示了可怕的性能

策略1:遞歸地使用Matlab的「目錄」功能。這是一個很好的功能,因爲它也提供了屬性,但它有點慢。在我的出發網絡文件夾(包含150個文件/文件夾,路徑存儲爲字符串SDIR)以下命令將34.088842秒:

tic;d=dir(Sdir);toc 

策略2:使用java.io.File中加快速度,這幾乎沒有幫助,因爲isDirectory需要調用。對項目名稱使用啓發式設置太危險,我不得不使用帶有點的文件夾。例如在同一個目錄中,31。315587秒:

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

回答

2

那些java.nio.file方法具有variadic signatures。看起來像Matlab無法做到使它們透明工作所需的自動裝箱,所以你需要用參數的數組形式來調用它們。

java.nio.file.Paths.get的簽名是get(String first, String... more)。這相當於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 

同樣,對於java.nio.file.Files.isDirectory簽名isDirectory(Path path, LinkOption... options),所以你需要提供options說法。

>> 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,該Files.walkFileTree方法將要求您實現自定義java.nio.file.FileVisitor子類,您將需要在Java中,不是純matlab做。另外,由於您使用的是網絡驅動器,因此網絡文件I/O實際上可能是您的瓶頸,因此請不要因爲Java NIO解決方案速度過快而抱有太高的期望。爲了使速度真的很快,遍歷需要在能夠快速訪問文件系統數據的機器上運行,或者甚至更好,爲了高效搜索而對其進行索引。