[英]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.