簡體   English   中英

將 java.nio.file.Path 轉換為 File 失敗

[英]converting java.nio.file.Path to File got failed

我正在嘗試將 .cer 文件打包到 jar 中,並使用 java 將它們動態安裝到密鑰庫。

private List<File> doSomething(Path p)  {
       
        List<java.io.File>FileList=new ArrayList<>();
        try {
            
            int level = 1;
            if (p.toString().equals("BOOT-INF/classes/certs")) {
                level = 2;

                Stream<Path> walk = Files.walk(p, level);
                for (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
                }
                
                logger.info("fileList" + FileList.size());
            }
        }
        catch(Exception e)
        {
            logger.error("error-----------"+e);
        }
        return FileList;
    }

我在 toFile() 中收到UnsupportedOperationException ,相信這是因為我試圖訪問 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM