Windows 10下Matlab实例化NIO文件系统遇ProviderNotFoundException解决方法
解决Matlab中Java NIO访问Windows本地文件夹的ProviderNotFound异常
错误原因
你用错方法了!java.nio.file.FileSystems.newFileSystem()是专门用来创建非默认文件系统的(比如zip、jar这类虚拟压缩文件系统),而Windows本地文件夹属于JVM默认的本地文件系统,根本不需要调用这个方法来创建新的FileSystem实例——直接用默认的就行,强行调用自然会找不到对应的Provider。
正确操作方式
1. 访问本地文件夹:直接用默认文件系统
不需要手动创建FileSystem,直接通过Paths.get()获取路径后,就可以调用NIO的文件操作方法(比如遍历、复制)。示例:
% 获取本地文件夹路径 localDir = java.nio.file.Paths.get('C:\test'); % 遍历文件夹下的文件 dirStream = localDir.newDirectoryStream(); iter = dirStream.iterator(); while iter.hasNext() file = iter.next(); disp(char(file.getFileName())); end dirStream.close();
2. 从压缩文件移动文件到本地文件夹的完整流程
你的核心需求是把压缩文件里的文件移到普通文件夹,正确步骤如下:
- 创建zip文件的FileSystem实例(这部分你之前的操作是对的)
- 获取压缩文件内的目标文件路径
- 获取本地文件夹的目标路径
- 用
Files.move()或Files.copy()完成操作
示例代码:
% 1. 打开zip文件的FileSystem zipPath = java.nio.file.Paths.get('C:\test\example.zip'); zipFs = java.nio.file.FileSystems.newFileSystem(zipPath, []); % 2. 获取zip内的文件路径和本地目标路径 zipFile = zipFs.getPath('/inside_zip.txt'); % zip内的文件路径 localDest = java.nio.file.Paths.get('C:\test\target.txt'); % 本地目标路径 % 3. 移动文件(要保留原文件就用copy,移动用move) java.nio.file.Files.move(zipFile, localDest, java.nio.file.StandardCopyOption.REPLACE_EXISTING); % 4. 关闭zip文件系统 zipFs.close();
关于你尝试的HashMap参数报错的说明
你之前试的FileSystem=java.nio.file.FileSystems.newFileSystem(FilePath,java.util.HashMap);报错,是因为Matlab中传递Java类的方式不对——这里需要传递HashMap的实例而非类本身。但更关键的是,这个参数是给自定义文件系统(比如zip)传递配置用的,本地文件系统根本不需要,所以这个尝试从根上就没必要。
内容的提问来源于stack exchange,提问作者Argyll
相关产品推荐
相关产品推荐

