如何在Matlab中使用java.nio?

时间:2017-01-02 14:24:56

标签: java matlab io directory nio

我的目标是检查网络上的文件夹中是否找到具有特定(部分名称)的文件,同时考虑其下的所有文件夹。为此,我需要一种方法来有效地获取给定文件夹中和下方的所有文件和文件夹的列表。我的递归函数在本地驱动器上执行约2500项/秒,但在网络驱动器上只有几秒/秒。我需要更快的东西。

核心问题是:获取文件夹中项目列表的最快方法是什么,包括属性isDirectory或类似内容?

我希望java.nio的walkFileTree功能,但我无法使用它。 (版本:8.4.0.150421(R2014b),Java 1.7.0_11-b21与Oracle Corporation 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的工作方式略有不同,要使用Files中需要路径的方法,可以使用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'. 

oracle解决方法是在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的'dir'函数。这是一个很好的功能,因为它也提供了属性,但它有点慢。在我的起始网络文件夹(包含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

1 个答案:

答案 0 :(得分:3)

这些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解决方案要快得多。为了实现这一目标,遍历需要在可以快速访问文件系统数据的计算机上运行,​​或者更好的是,将索引编入索引以进行高效搜索。