1.相对路径概念
1.1 相对路径就是相对于目标文件或(相对虚拟目录)的位置。,请看上图,“a.html” 文件里引用了“b.jpg”图片,由于“b.jpg”图片相对于“a.html”来说,是在同一个目录的,那么要在“a.html”文件里使用以下代 码后,只要这两个文件的相对位置没有变(也就是说还是在同一个目录内),那么无论上传到Web服务器的哪个位置,在浏览器里都能正确地显示图片.
<body backgroud="b.jpg">
1.2 在相对路径表示中,用./表示当前目录,所以上面代码等价于<body backgroud="./b.jpg">./指的就是html文件夹,那么../表示啥意思呢?聪明的你一定猜到了-就是表示上一级目录,a.html所在的目录是html文件夹,则他的上一级目录就是WebRoot,那么我们怎么在a.html中引用c.jpg呢?
<body backgroud="../image/c.jpg"> 即WebRoot/image/c.jpg
1.3 问题
再看上图,MainC.java中通过new File(path)想读取e.txt,按照1.1和1.2说的,e.txt和MainC.java处于同一目录,所以这段代码应该没有问题,但是运行却报“文件找不到异常”,这是怎么回事呢?这就涉及到相对虚拟目录的问题了。
2.相对虚拟目录
2.1 java.io默认定位到当前用户目录("user.dir")下,即:工程根目录 System.getProperty("user.dir")得到的是“F:\JavaStudy\RelativePath”,这个目录就是java.io的相对虚拟目录,那么现在我们想读取e.txt到底该怎么做呢,
String path="src/first/second/third/e.txt"; File file=new File(path);
现在就可以正确读取e.txt了
2.2 java字节码对象 类.class.getResource("文件路径").getPath();
除了2.1读取e.txt我们还可以通过java字节码读取
String path2=MainC.class.getResource("e.txt").getPath(); File file=new File(path2);
原理是啥呢?原来 - 类.class.getResource的相对虚拟目录就是该 “类”的class文件路径,在本例MainC.class.getResource的相对虚拟目录就是“F:/JavaStudy/RelativePath/bin/first/second/third/”,而文件e.txt和MainC.class在同一目录,所以直接用相对路径“e.txt”就可以读取了,那么我们想读取c.txt怎么办?
String path3=MainC.class.getResource("../../c.txt").getPath(); File file=new File(path3);
path3就是F:/JavaStudy/RelativePath/bin/first/c.txt”
3.总结
使用函数的情况下就要考虑相对虚拟目录。再根据虚拟目录进行判断文件的相对位置。
暂且写这么多,本文纯手打,欢迎大家批评指正