1.URI URL URN 3个关系
URI unform resource Identifier 统一资源标识符
URL unform resource Locator 统一资源定位符 可以定位 就可以找到这个物件
你可以试下在本地打开网页 看下地址栏 就明白了
URN unform resource Name 统一资源命
URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源
2.JAVA拿路径
File API 说明
无论是抽象路径名还是路径名字符串,都可以是绝对 路径名或相对 路径名。绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的文件。相反,相对路径名必须使用取自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录
TOMCAT下 user.dir 就是Tomcat\bin 目录
而且在不同环境下user.dir 值就不一样 所以用这个来定位资源 是很危险的
最佳方式就是用拿类的绝对路径,然后在相对路径拿你需要文件路径
jsp里面拿路径的话
总结:在项目要拿文件路径的时候 最好先把路径先打印出来。然后根据路径在来拼接字符串
URI unform resource Identifier 统一资源标识符
URL unform resource Locator 统一资源定位符 可以定位 就可以找到这个物件
你可以试下在本地打开网页 看下地址栏 就明白了
URN unform resource Name 统一资源命
URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源
2.JAVA拿路径
File API 说明
无论是抽象路径名还是路径名字符串,都可以是绝对 路径名或相对 路径名。绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的文件。相反,相对路径名必须使用取自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录
TOMCAT下 user.dir 就是Tomcat\bin 目录
而且在不同环境下user.dir 值就不一样 所以用这个来定位资源 是很危险的
最佳方式就是用拿类的绝对路径,然后在相对路径拿你需要文件路径
package myd.utils;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.junit.*;
public class DataSoruce {
@Test
public void myTest()
{
Properties properties = new Properties();
InputStream in;
try {
// System.out.println(this.getClass().getResource(""));//相对路径
System.out.println(this.getClass().getResource("/"));//绝对路径
//in = new BufferedInputStream (new FileInputStream("WebRoot/WEB-INF/classes/test2.properties"));
/*
* n = getClass().getResourceAsStream("/test2.properties")
* 和下面效果一样 一个是绝对路径 一个是相对路径应用 /开头表明是绝对路径
* 这个地方的相对路径所依据参考路径 就是classpath所在目录 也就是CLASS这目录 加了
* /就表明拿到这个绝对路径 所以就是CLASSPATH
* 不加/就表明是相对 自然需要../../向上升级目录了
* 这种../../ 方式就可以定位到各个位子的资源了
*/
//in = getClass().getResourceAsStream("../../test2.properties");
System.out.println(getClass().getClassLoader().getResource(""));
//这样访问不了 不明白原因 硬盘直接使用是可以执行的
//找到原因了 目前的JDK提供的ClassLoader类的getResource(String 相对路径)方法,只能接受一般的相对路径。这样,使用ClassLoader类的getResource(String 相对路径)方法就只能定位到classpath下的资源
//in = getClass().getClassLoader().getResourceAsStream("../../../../test2.properties");
//拿CLASSpath目录外的文件方式
System.out.println(new File(this.getClass().getResource("").getFile(),"../../../../test2.properties").getCanonicalFile());
in = new FileInputStream(new File(this.getClass().getResource("").getFile(),"../../../../test2.properties"));
properties.load(in);
//File f = new File("test");
//System.out.println("fs"+f.getAbsolutePath());
System.out.println(System.getProperty("user.dir"));
System.out.println(properties.getProperty("jdbc.driverClassName"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
jsp里面拿路径的话
<%=request.getRealPath("/")%>
总结:在项目要拿文件路径的时候 最好先把路径先打印出来。然后根据路径在来拼接字符串