转自:http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html
file的这几个取得path的方法各有不同,下边说说详细的区别
概念上的区别:(内容来自jdk,个人感觉这个描述信息,只能让明白的人明白,不明白的人看起来还是有点难度(特别试中文版,英文版稍好些)所以在概念之后我会举例说明。如果感觉看概念很累就跳过直接看例子吧。看完例子回来看概念会好些。
【yasi】
下面的代码输出为
D:\work\t\yasi\target\te
它说明了两点:
1)getCanonicalPath() 是先调用底层操作系统的C函数将相对路径转成了绝对路径,相对路径中的 两点“..”都翻译成了真实的路径,即执行了 ".." 之后的路径
2)getCanonicalPath() 调用底层操作系统的C函数翻译成绝对路径时,Java语言不敏感的"\0"被C语言当成了字符串结束符,从而将"\0"后面的部分全部砍掉了
package com.yasi; import java.io.File; import java.io.IOException; public class Test { public static void main(String[] args) { // File file = new File("D:\\work\\t\\yasi1\\..\\yasi\\target\\te\u0000st.txt"); it is of the same effect File file = new File("D:/work/t/yasi1/../yasi/target/te\0st.txt"); try { String dirPath = file.getCanonicalPath(); System.out.println(dirPath); } catch (Exception e) { System.out.println(e.getMessage()); } } }
注意:
1)
File file = new File("D:/work/t/yasi1/../yasi/target/te st.txt"); String dirPath = file.getCanonicalPath();
得到的 dirPath 是“D:\work\t29.8\yasi\target\te st.txt”,即空格处不被截断,只有 '\0' 才会造成截断
2)参考这里
String dirPath2 = FilenameUtils.normalize("D:/work/t/yasi1/../yasi/target/te\0st.txt"); String dirPath3 = FilenameUtils.normalizeNoEndSeparator("D:/work/t/yasi1/../yasi/target/te\0st.txt");以上代码输出都是 “D:\work\t29.8\yasi\target\te st.txt”,即没有考虑 '\0' 的截断
3)
下面的代码实际加载的文件是canonicalPath,即按照'\0'做了截断以及执行了".."之后的绝对路径,而不是 "D:/work/t/yasi1/../yasi/target/te\0st.txt" 本身
File file = new File("D:/work/t/yasi1/../yasi/target/te\0st.txt");
4)
"1.txt\0.doc" 的值在Eclipse中调试时会显示成 "1.txt .doc",即 "\0" 被显示成了一个空格,但整个字符串会被截断成 "1.txt",用它去创建一个File对象file,则file.getCanonicalPath() 返回完整路径末尾将是 "1.txt"
"1.txt .doc" (中间不是"\0",而是一个空格)的值在Eclipse中调试时也会显示成 "1.txt .doc",但整个字符串不会被截断,用它去创建一个File对象file,则file.getCanonicalPath() 返回完整路径末尾将是 "1.txt .doc"
5)
如果要在url中插入一个null-byte,可以插入url-encode过后的 "%00"。"0x00"是不可以的