我的目標用於檢查是否在網絡上的文件夾中找到具有特定(名稱的一部分)的文件,同時也考慮到它下面的所有文件夾。爲此,我需要一種方法來高效地獲取給定文件夾中和下面的所有文件和文件夾的列表。我的遞歸函數在本地驅動器上約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