Java文件路径中~在Windows环境生效的原因及文档咨询
为什么Windows环境下使用Java的File类创建带~符号的路径能成功?
我编写了如下Java测试代码,在文件路径中使用~符号后,发现即使在Windows环境下也能成功创建目录。请问这一现象的原因是什么?能否提供相关官方文档进行解释?我自行查找未找到相关内容。
package com.my.example; import org.junit.Test; import java.io.File; public class TestPathCreation { @Test public void testPathCreation() throws Exception { final String path = "~/.my/dir"; System.out.println(path); File f = new File(path); System.out.println(f.mkdirs()); // 输出true } }
原因解释
其实这里有个容易混淆的点:Java的File类本身并不会自动解析~符号为用户主目录——你看到的成功创建,是因为Windows文件系统允许将~作为目录名的一部分,代码实际上是在当前工作目录下创建了一个名为~的目录,然后在其中创建.my/dir子目录。
你可以通过打印文件的绝对路径验证这一点:
System.out.println(f.getAbsolutePath());
输出会是类似D:\your-project-root\~/.my/dir(取决于你的项目工作目录),而不是Windows用户主目录(比如C:\Users\YourName\.my/dir)。
Windows文件系统的命名规则里,~是合法的字符(禁止的字符是< > : " / \ | ? *),所以mkdirs()方法可以正常创建这些目录,不会报错。
官方文档相关说明
在Java SE的java.io.File类文档中明确提到:
此类的实例表示文件和目录路径名的抽象表示形式。路径名可以是绝对路径,也可以是相对路径。File类依赖于底层平台的文件系统,它不会对路径字符串进行shell风格的扩展(比如
~这类shell特有的路径简写)。
如果需要将~解析为用户主目录,你需要手动处理:
- 方式1:使用
System.getProperty("user.home")获取用户主目录,替换路径中的~:String home = System.getProperty("user.home"); String path = "~/.my/dir".replaceFirst("^~", home); File f = new File(path); - 方式2(Java 7+推荐):使用
java.nio.file.PathsAPI,结合用户主目录构建路径:Path path = Paths.get(System.getProperty("user.home"), ".my", "dir"); Files.createDirectories(path);
内容的提问来源于stack exchange,提问作者GionJh
相关产品推荐
相关产品推荐

