如何在Matlab中使用java.nio?
我的目标是检查是否在网络上的文件夹中找到了具有特定(名称的一部分)的文件,同时考虑到其下方的所有文件夹。要做到这一点,我需要一种方法,以有效地获得一个列表中的所有文件和文件夹和下面的一个给定的文件夹。我的递归函数在本地驱动器上每秒执行2500个项目,但在网络驱动器上仅每秒执行几项。我需要快一点的 核心问题是:获取文件夹中包含isDirectory属性或类似属性的项目列表的最快方法是什么? 我把希望寄托在java.nio的walkFileTree功能上,但我无法使用它。(版本:8.4.0.150421(R2014b),带Java 1.7.0_11-b21,带Oracle Corporation Java HotSpot™ 64位服务器虚拟机(混合模式) 当前问题:我无法使用java.nio中的任何功能 java.io起作用,例如创建文件对象:如何在Matlab中使用java.nio?,java,matlab,io,directory,nio,Java,Matlab,Io,Directory,Nio,我的目标是检查是否在网络上的文件夹中找到了具有特定(名称的一部分)的文件,同时考虑到其下方的所有文件夹。要做到这一点,我需要一种方法,以有效地获得一个列表中的所有文件和文件夹和下面的一个给定的文件夹。我的递归函数在本地驱动器上每秒执行2500个项目,但在网络驱动器上仅每秒执行几项。我需要快一点的 核心问题是:获取文件夹中包含isDirectory属性或类似属性的项目列表的最快方法是什么? 我把希望寄托在java.nio的walkFileTree功能上,但我无法使用它。(版本:8.4.0.1504
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'.
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
那些
java.nio.file
。看起来Matlab无法执行使其透明工作所需的自动装箱,因此需要使用其参数的数组形式调用它们
java.nio.file.Paths.get的签名是get(字符串优先,字符串…更多)
。这相当于get(字符串优先,字符串[]更多)
类似地,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
>>
顺便说一句,Files.walkFileTree
方法将要求您实现一个自定义的java.nio.file.FileVisitor
子类,您需要用java而不是普通的Matlab来实现
另外,由于您使用的是网络驱动器,因此网络文件I/O实际上可能是您的瓶颈,因此不要对Java NIO解决方案的速度抱有太高的期望。为了使这一过程真正快速,遍历需要在一台能够快速访问文件系统数据的机器上运行,或者更好,在一台能够为文件系统数据建立索引以进行高效搜索的机器上运行
>> 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
>>