当前位置: 首页 > 知识库问答 >
问题:

如何在MATLAB中使用java.nio?

宰父才
2023-03-14

我的目标是检查是否在网络上的文件夹中找到具有特定(名称的一部分)的文件,同时考虑到它下面的所有文件夹。要做到这一点,我需要一种方法,以有效地获得一个列表的所有文件和文件夹在给定的文件夹和下面。我的递归函数在本地驱动器上每秒处理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

共有1个答案

郑宜民
2023-03-14

这些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