微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将java.nio.file.Path转换为File失败

如何解决将java.nio.file.Path转换为File失败

我正在尝试将.cer文件打包在jar中,并使用Java将它们动态安装到密钥库中。

status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2020-09-15T07:17:25Z"
    status: "True"
    type: Initialized
  containerStatuses:
  - containerID: docker://25b28170c8cec18ca3af0e9c792620a3edaf36aed02849d08c56b78610dec31b
    image: myimage
    imageID: docker-pullable://myimage@sha256:a432251b2674d24858f72b1392033e0d7a79786425555714d8e9a656505fa08c
    name: myapp
    restartCount: 0

我收到 UnsupportedOperationExceptionin toFile(),相信这是因为我正在尝试访问jar中的文件。 有什么办法可以将此Path(nio.file.Path)转换为实际文件或流?

解决方法

Path#toString()不会返回正斜杠( / )的路径,就像您要比较的字符串路径一样。它以反斜杠( \ )返回它,因此您的比较永远不会成为现实。

从本地文件系统读取路径时,请始终使用与系统相关的路径或文件分隔符。为此,您可以使用String#replaceAll()方法将任何路径名斜杠转换为适合您的代码所操作的文件系统的路径,例如:

String pathToCompare = "BOOT-INF/classes/certs"
                       .replaceAll("[\\/]","\\" + File.separator);

这应该可以正常工作:

private List<java.io.File> doSomething(java.nio.file.Path p) {
    java.util.List<java.io.File> FileList = new java.util.ArrayList<>();
    try {
        int level = 1;
        String pathToCompare = "BOOT-INF/classes/certs"
                               .replaceAll("[\\/]","\\" + File.separator);
        if (p.toString().equals(pathToCompare)) {
            level = 2;
            java.util.stream.Stream<Path> walk = java.nio.file.Files.walk(p,level);
            for (java.util.Iterator<Path> it = walk.iterator(); it.hasNext();) {
                System.out.println(it.next());//getting all .cer files in the folder
                FileList.add(it.next().toFile());//getting an error UnsupportedOperationException Path not associated with
            }
        }
    }
    catch (Exception e) {
        System.err.println(e);
    }
    return FileList;
}

编辑:

如果您要基于特定的文件扩展名或JAR文件的内容进行列表,则需要做一些不同的事情。下面的代码与您一直在使用的代码非常相似,除了:

  • 方法名称更改为 getFilesList();
  • 列表返回为 List<String> ,而不是 List<File> ;
  • 深度级别现在是提供给该方法的参数(始终 确保深度级别足以执行任务);
  • 可选的String args参数(名为:onlyExtensions)已被使用 添加到方法中,以便可以扩展一个(或多个)文件扩展名 应用于返回仅包含文件所在路径的列表 名称包含所应用的扩展名。如果提供了扩展名 恰好是".jar",那么该JAR文件的内容也将 应用于返回的列表。如果什么都没提供,那么全部 文件将返回到列表中。

对于JAR文件,还提供了一个辅助方法:

根据需要修改任何代码:

public static List<String> getFilesList(String thePath,int depthLevel,String... onlyExtensions) {
    Path p = Paths.get(thePath);
    java.util.List<String> FileList = new java.util.ArrayList<>();
    try {
        java.util.stream.Stream<Path> walk = java.nio.file.Files.walk(p,depthLevel);
        for (java.util.Iterator<Path> it = walk.iterator(); it.hasNext();) {
            File theFile = it.next().toFile();
            if (onlyExtensions.length > 0) {
                for (String ext : onlyExtensions) {
                    ext = ext.trim();
                    if (!ext.startsWith(".")) {
                        ext = "." + ext;
                    }
                    if (!theFile.isDirectory() && theFile.getName().substring(theFile.getName().lastIndexOf(".")).equalsIgnoreCase(ext)) {
                        FileList.add(theFile.getName() + " --> " + theFile.getAbsolutePath());
                    }
                    else if (!theFile.isDirectory() && theFile.getName().substring(theFile.getName().lastIndexOf(".")).equalsIgnoreCase(".jar")) {
                        List<String> jarList = getFilesNamesFromJAR(theFile.getAbsolutePath());
                        for (String strg : jarList) {
                            FileList.add(theFile.getName() + " --> " + strg);
                        }
                    }
                }
            }
            else {
                FileList.add(theFile.getAbsolutePath());
            }
        }
    }
    catch (Exception e) {
        System.err.println(e);
    }
    return FileList;
}

JAR文件帮助程序方法:

public static java.util.List<String> getFilesNamesFromJAR(String jarFilePath) {
    java.util.List<String> fileNames = new java.util.ArrayList<>();
    java.util.zip.ZipInputStream zip = null;
    try {
        zip = new java.util.zip.ZipInputStream(new java.io.FileInputStream(jarFilePath));
        for (java.util.zip.ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
            fileNames.add(entry.getName());
        }
    }
    catch (java.io.FileNotFoundException ex) {
        System.err.println(ex);
    }
    catch (java.io.IOException ex) {
        System.err.println(ex);
    }
    finally {
        try {
            if (zip != null) {
                zip.close();
            }
        }
        catch (IOException ex) {
            System.err.println(ex);
        }
    }
    return fileNames;
}

要使用 getFileList()方法,您可以执行以下操作:

List<String> fileNames = getFilesList("C:\\MyDataFolder",3,".cer",".jar");

// Display files in fileNames List
for (String str : fileNames) {
    System.out.println(str);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。