标签:io directory nio matlab java
我的目标是检查在网络上的文件夹中是否找到具有特定名称(名称的一部分)的文件,同时还要考虑其下的所有文件夹.为此,我需要一种有效获取给定文件夹内和下的所有文件和文件夹的列表的方法.我的递归函数在本地驱动器上的速度约为2500个/秒,而在网络驱动器上的速度仅为每秒/个.我需要更快的东西.
核心问题是:在包含属性isDirectory或类似属性的文件夹中获取项目列表的最快方法是什么?
我将希望寄托在java.nio的walkFileTree功能上,但是我无法使用它. (版本:带有Java 1.7.0_11-b21且具有Oracle Corporation Java HotSpot™64位服务器VM混合模式的8.4.0.150421(R2014b))
当前问题:我无法使用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
解决方法:
这些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(路径,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解决方案要快得多.为了真正做到这一点,遍历需要在能够快速访问文件系统数据的机器上运行,甚至更好的是,已经对其进行了索引以进行有效搜索的机器上.
标签:io,directory,nio,matlab,java 来源: https://codeday.me/bug/20191111/2023045.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。