我的目标是检查是否在网络上的文件夹中找到具有特定(名称的一部分)的文件,同时考虑到它下面的所有文件夹。要做到这一点,我需要一种方法,以有效地获得一个列表的所有文件和文件夹在给定的文件夹和下面。我的递归函数在本地驱动器上每秒处理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的工作方式有点不同,要在文件中使用方法,需要一个路径,可以使用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(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
>>
顺便说一句,files.walkfileTree
方法将要求您实现一个自定义的Java.nio.file.FileVisitor
子类,您将需要在Java中完成,而不是在普通的MATLAB中完成。
此外,由于您是在网络驱动器上,网络文件I/O实际上可能是您的瓶颈,所以不要对Java NIO解决方案更快的期望过高。为了使之更快,遍历需要在一台能够快速访问文件系统数据的机器上运行,或者更好的是,在一台为高效搜索而编制索引的机器上运行。
问题内容: 我有一个处理图像的Matlab代码。我想创建一个使用该代码的Hadoop映射器。我遇到了以下解决方案,但不确定哪种解决方案最好(对我而言,很难在hadoop中的每个从属节点上安装matlab编译器运行时): 手动将Matlab代码转换为C ++中的OpenCV,然后从映射器中调用其exe / dll(并为其提供适当的参数)。不确定,因为群集在每个节点上都安装了Linux,而不是Wind
如何从matlab运行clojure脚本? 我尝试了以下方法:使用jdk 1.7运行matlab,然后调用java 在matlab中,设置类路径并使用clojure编译器 这里有个错误: 当我编写运行clojure的java类时,一切都可以从控制台运行,但不能从matlab运行。请给出建议。
问题内容: 我需要在Matlab中运行Java .jar文件。 我们将文件称为MyJar.jar,如果有帮助,我正在运行Java 1.8.0_121-b13。 我尝试了不同的解决方案,并收到了这些相应的错误 我已经设置了javaclasspath:C:\ My \ Java \ Class \ Path \ To \ MyJar.jar(即使它没有任何帮助) 我什至已经准备好编辑classpath
我在Matlab(GUI)中有一个带有“OK”按钮的对话框。
我正在使用一个僵硬的求解器(ode15s)对一个颂歌系统进行时间积分。它在起作用,但我想加快速度。 方程组以状态空间形式给出: 这里的诀窍部分是强迫函数F,它是高度非线性的,依赖于x和t参数。它利用x参数求解Poisson型二维方程(用有限体积法)。力F与泊松方程解成正比。 用迭代法求解泊松方程需要一个初始条件,我把它设为零()。我想我可以通过提供一个更好的场的初始估计来提高计算速度(一个更好的初
我一直在搜索如何使用MATLAB访问iphone相机,我发现它可以通过一个叫做IP CAM的应用程序使用本地网络访问。然而,苹果商店上存在的IP Cam程序的解决方案对我的应用程序不太好用,因为我正在尝试使用iPhone的摄像头和Matlab mobile建立一个实时图像捕获程序,并进行后期处理(只要Matlab显示场景,这种方法就会使Matlab忙碌,我仍然希望Matlab运行在前台,而不是IP