2011-09-01 86 views
10

我想基于用户提供的文件名(可能是绝对的或相对的)和依赖于环境的基本目录来构建Java文件对象。对于java.io.File中(文件父,子字符串)的Java文档说以下内容:java.io.File(父,子)不能正常工作

如果孩子路径名字符串是绝对的那么被转换成一个系统相关的方式相对路径名

这让我觉得,如果我有以下代码:

public class TestClass { 
    public static void main(String[] args) throws IOException { 
     File file = new File(new File("C:/Temp"),"C:/Temp/file.txt"); 
     System.out.println(file.getAbsolutePath()); 
    } 
} 

输出将

C:\Temp\file.txt 

,然后我会在业务,因为它不会真正的问题如果用户提供了绝对或相对路径。但事实上,产量

C:\Temp\C:\Temp\file.txt 

这意味着我必须找出确切的相对路径(或至少测试不同的选项,以查看是否存在该文件)。我误解了JavaDoc?

+0

子路径名必须是相对路径名。我认为,这个转换谈到了斜杠与反斜杠。就你而言,在继续之前,你必须弄清楚路径是否绝对。 – Thilo

+0

如果您使用(更正确)'“C:\\ Temp \”和'“C:\\ Temp \\ file.txt”'而不是使用前向冲突,那么行为是否相同?我目前没有安装JDK的Windows PC,所以我无法测试它。另外:什么'新的文件(“C:/温度”)。isAbsolute()'打印? –

+0

@Joachim:“C:/ Temp”和“C:\ Temp”都被视为相同。 '新文件(“C:/ Temp”)。isAbsolute()'打印'true'。 – Geert

回答

7

如果孩子路径名字符串是绝对的,然后它被转换成一个系统相关的方式相对路径名。

我假定这意味着即使如果提供绝对路径,它将被转换到(在一个系统有关的方式),并且如,相对路径处理。

这意味着我必须找出确切的相对路径(或至少测试不同的选择,以查看是否存在该文件)。

是的,我相信如此。

这或许与

file.getAbsolutePath().startsWith(parent.getAbsolutePath()); 

可以轻松完成,以检查它是否在parent的绝对路径的目录,并

file.getAbsolutePath().substring(parent.getAbsolutePath().length()); 

得到相对的一部分。

+0

嗯,当说绝对路径被当作相对路径(当然是它的样子)时,你可能是对的。这将是一个耻辱(和可怜的JavaDoc imho ;-))。我会喋喋不休地提出一些建议,看看对我有用,谢谢! – Geert