簡體   English   中英

Java - 組合字符串路徑名不起作用

[英]Java - Composing String pathnames doesn't work

在以String格式操作文件和目錄的路徑名時,我使用所有目錄路徑名以File.separator結尾的約定。 這為我提供了一種簡單的系統內方式來區分文件和目錄,並且還允許我非常輕松地編寫路徑名。

Java 但是不遵循這個約定。 這意味着每次我從某個地方獲取目錄的路徑名時,我都需要檢查它是否以File.separator ,如果不是,則將字符串添加到路徑名中。 看起來很容易,對吧?

我無法讓它工作。

方法pathOfCurrentDirectory()查找啟動 JVM 的程序的目錄,並返回其絕對路徑名,並以File.separator結尾 createLogFile()方法使用前面的方法創建日志文件的絕對路徑名,如果需要,創建丟失的目錄,創建文件,然后返回其絕對路徑名。

pathOfCurrentDirectory()中的檢查使它看起來像它的 output 真正按預期以File.separator結尾。 createLogFile()中的檢查使它看起來不像。 怎么了?

    public static String createLogFile() {
        String pathOfCurrentDirectory = pathOfCurrentDirectory();
        String logDirectory = pathOfCurrentDirectory + "Log" + File.separator;
        System.out.println();
        System.out.println("pathOfCurrentDirectory: " + pathOfCurrentDirectory
                    + "\n logDirectory = " + logDirectory);
        String path = logDirectory + "Log_" + LogUtilities.dateId() + ".log";
        System.out.println("logFile: " + path + "\n logFile.exists() = " + new File(path).exists());
        
        FilesUtility.createNewFile(new File(path));
        System.out.println("After creation, logFile.exists() = " + new File(path).exists());
        
        return path;
    }
    public static String pathOfCurrentDirectory() {
        String output = new File(System.getProperty("user.dir")).getAbsolutePath();
    //  System.out.println("Dir: " + output);
    //  System.out.println("File.separatorChar = " + File.separatorChar);
        System.out.println("Last char of dir: " + output.charAt(output.length()-1));
        System.out.println("modifiedDir = " + (output + File.separator));
        String newOutput = (output + File.separator);
        System.out.println("newOutput = " + newOutput);
        //  return output;
        if( output.charAt(output.length()-1) == File.separatorChar )
             return newOutput;
        else return output; 
    }

Java 有 2 個專門用於操作路徑名的類 - 文件和路徑,如果您使用這些類,您幾乎不需要使用File.separator和風險字符串處理錯誤。

這顯示同時使用文件和路徑:

public static void main(String[] args) throws IOException
{
    Files.createDirectories(Path.of(pathOfCurrentDirectory(), "Log"));
    File f = createLogAsFile();
    Path p = createLogAsPath();
}
private static Path createLogAsPath() throws IOException
{
    Path path = Path.of(pathOfCurrentDirectory(), "Log", "Log_" + LogUtilities.dateId() + ".log");
    System.out.println("createLogAsPath " + path + "\nFiles.isRegularFile(path) = " + Files.isRegularFile(path));
    Files.createFile(path);
    System.out.println("After creation, Files.isRegularFile(path) = " +Files.isRegularFile(path));
    return path;
}
private static File createLogAsFile() throws IOException
{
    File logDirectory = new File(pathOfCurrentDirectory(), "Log");
    File path = new File(logDirectory, "Log_" + LogUtilities.dateId() + ".log");
    System.out.println("createLogAsFile: " + path + "\n logFile.exists() = " + path.exists());
    path.createNewFile();
    System.out.println("After creation, logFile.exists() = " +path.exists());
    return path;
}
public static String pathOfCurrentDirectory() {
    return System.getProperty("user.dir");
}

您是否使用 File 或 Path 版本將取決於您的其他代碼,盡管它們很容易在 toPath 或 toFile 調用之間切換。

你真的可以用你的createLogFile()

String filename = String.format("Log_%s.log", LogUtilities.dateId());
Path logfile = Paths.get("Log", filename); 
FilesUtility.createNewFile(logfile.toFile());

暫無
暫無

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

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