关于new File("/usr/local/log/")在windows下的结果

如题,我是在tomcat启动的服务,其中某HTTP接口代码中使用了new File("/usr/local/log/"),经过调用filegetCanonicalPath方法,得到完整目录:D:\user\local\log\。这个如何理解?为什么是D盘?和tomcat所在路径有关吧?
我在log4j.properties文件这样配置:log4j.appender.DailyRollingFile.File=/usr/local/log/meal.log,在windows机器就会将日志生成到D:\user\local\log\目录下。

阅读 3.6k
2 个回答

因为你的程序运行在 D 盘,当前盘符是 D:。你换个盘运行试一下。

请看jdk api File类的文档。
getCanonicalPath()的文档

规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换为绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如 "." 和 "..")、解析符号连接(对于 UNIX 平台),以及将驱动器号转换为标准大小写形式(对于 Microsoft Windows 平台)。每个表示现存文件或目录的路径名都有一个惟一的规范形式。每个表示不存在文件或目录的路径名也有一个惟一的规范形式。不存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现存文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。

根据上面的文档说明我们来看getAbsolutePath()方法说明:

如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与 getPath() 方法一样。如果此抽象路径名是空抽象路径名,则返回当前用户目录的路径名字符串,该目录由系统属性 user.dir 指定。否则,使用与系统有关的方式解析此路径名。在 UNIX 系统上,根据当前用户目录解析相对路径名,可使该路径名成为绝对路径名。在 Microsoft Windows 系统上,根据路径名指定的当前驱动器目录(如果有)解析相对路径名,可使该路径名成为绝对路径名;否则,可以根据当前用户目录解析它。

你上面的File file = new File("/usr/local/log/")。

        File hello = new File("/usr/local/log/");
        System.out.println(System.getProperty("user.dir"));//D:\scsworkspace\study
        //在linux上 /usr/local/log/这个就是一个绝对路径,没有什么好说的,输出就是/usr/local/log
        //在window系统上,如果路径以/或者“\”开头,解析路径相当于盘符,所以getCanonicalPath输出为盘符+"/usr/local/log"
        System.out.println("getCanonicalPath:"+hello.getCanonicalPath());//getCanonicalPath:D:\\usr\\local\\log
        File hello2 = new File("user/local/log/");
        //相对路径在linux和window一致的,getCanonicalPath输出为 user.dir + "路径分隔符" + user/local/log/
        System.out.println("getCanonicalPath:"+hello2.getCanonicalPath());//getCanonicalPath:D:\\usr\\local\\log    

看文档更靠谱。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题