Filefile=newFile("D:\\123.txt");
你这种不用绝对路径是不行的,
只有一个方法,在web工程启动servlet中获取到webroot路径,在servlet的init中使用StringwebRoot=getServletContext().getRealPath("/");获取,然后使用这webRoot变量追加路径,再newFile(),这样的话要求就是,你的服务必须要启动,否则不会init,无法得到工程发布目录的相对路径
在jsp和class文件中调用的相对路径不同。在jsp里,根目录是WebRoot在class文件中,根目录是WebRoot/WEB-INF/classes当然你也可以用System.getProperty("user.dir")获取你工程的绝对路径。
另:在Jsp,Servlet,Java中详细获得路径的方法!
1.jsp中取得路径:
以工程名为TEST为例:
(1)得到包含工程名的当前页面全路径:request.getRequestURI()
结果:/TEST/test.jsp
(2)得到工程名:request.getContextPath()
结果:/TEST
(3)得到当前页面所在目录下全名称:request.getServletPath()
结果:如果页面在jsp目录下/TEST/jsp/test.jsp
(4)得到页面所在服务器的全路径:application.getRealPath("页面.jsp")
结果:D:/resin/webapps/TEST/test.jsp
(5)得到页面所在服务器的绝对路径:absPath=newjava.io.File(application.getRealPath(request.getRequestURI())).getParent();
结果:D:/resin/webapps/TEST
2.在类中取得路径:
(1)类的绝对路径:Stringu=Class.class.getClass().getResource("/").getPath()
结果:/D:/TEST/WebRoot/WEB-INF/classes/pack/
(2)得到工程的路径:System.getProperty("user.dir")
结果:D:/TEST
3.在Servlet中取得路径:
(1)得到工程目录:request.getSession().getServletContext().getRealPath("")参数可具体到包名。
结果:E:/Tomcat/webapps/TEST
(2)得到IE地址栏地址:request.getRequestURL()
(3)得到相对地址:request.getRequestURI()
结果:/TEST/test
以工程名为TEST为例:(1)得到包含工程名的当前页面全路径:request.getRequestURI()结果:/TEST/test.jsp(2)得到工程名:request.getContextPath()结果:/TEST(3)得到当前页面所在目录下全名称:request.getServletPath()结果:如果页面在jsp目录下/TEST/jsp/test.jsp(4)得到页面所在服务器的全路径:application.getRealPath("页面.jsp")结果:D:/resin/webapps/TEST/test.jsp(5)得到页面所在服务器的绝对路径:absPath=newjava.io.File(application.getRealPath(request.getRequestURI())).getParent();结果:D:/resin/webapps/TEST。
相对路径的话,可以先获取到当前文件的编译路径,之后在找到想找文件的路径的思路来实现。
举例:
XMLS.class.getClass().getResourceAsStream("/test/test.txt");
解释:XMLS.class.getClass()是获取当前的类编译路径,之后通过getResourceAsStream的形式即可找到要读取的文件的路径。
备注:这个方法中后面的路径也可以通过截取的形式来进行路径获取,实现原理都是找到当前类路径,之后通过相对位置找到另外文件路径。
1.使用java.lang.Class类的getResourceAsStream(Stringname)方法
InputStreamin=getClass().getResourceAsStream("/config.properties");在静态方法中,由于不能使用getClass()方法,必须写出类的名字。区别不大。
MyClass.class.getResourceAsStream("/config.properties");使用这个方法,路径前面可以加斜杠也可以不加。根据Class类getResourceAsStream()方法的JavaDoc:
Findsaresourcewithagivenname.Therulesforsearchingresourcesassociatedwithagivenclassareimplementedbythedefiningclassloaderoftheclass.Thismethoddelegatestothisobject'sclassloader.Ifthisobjectwasloadedbythebootstrapclassloader,themethoddelegatestoClassLoader..
Beforedelegation,anabsoluteresourcenameisconstructedfromthegivenresourcenameusingthisalgorithm:
Ifthenamebeginswitha'/'('\u002f'),thentheabsolutenameoftheresourceistheportionofthenamefollowingthe'/'.
Otherwise,theabsolutenameisofthefollowingform:
modified_package_name/name
Wherethemodified_package_nameisthepackagenameofthisobjectwith'/'substitutedfor'.'('\u002e').
就是说,这个path假如以斜杠开头,则斜杠后面的部分是文件相对classpath的路径;假如不是,Java会把这个path看作是“包名/文件名”的结构,会尝试在这个类的包里面去找,而不是从classpath开始找;在这种情况下,除非你把properties文件放到MyClass.class所属的包里面,不然都会是null的。
2.使用java.lang.ClassLoader类的getResourceAsStream(Stringname)方法
路径是不能加斜杠的!非常重要。
MyClass.class.getClassLoader().getResourceAsStream("config.properties");这是因为使用classloader进行读取,所输入的参数必须是一个相对classpath的绝对路径,在格式上,一个绝对路径是不能以'/'开头的。
注意这两个方法是同名的,但路径参数的格式截然不同。
3.在Maven中的运用
现在几乎所有的webproject都是mavenproject,Maven的默认设置是把
src/main/resources/加入到classpath里面的。那么,最好的做法是把你的properties文件放进src/main/resources里面,然后用上面代码读取。用Class类的,一般要加斜杠;用ClassLoader类的,绝不能加斜杠!
假如是Eclipse里面,需要把这个src/main/resources加到classpath里面。具体操作是右击工程,选择“Configurebuildpath”,根据Maven的要求,把src/main/java和src/main/resources都加进去,并且保证Exclude是none,Include是all,或者至少要包括你需要读取的文件。
File类有两个常用方法可以得到文件路径一个是:getCanonicalPath(),另一个是:getAbsolutePath(),可以通过File类的实例调用这两个方法例如file.getAbsolutePath()其中file是File的实例对象。下面是一个具体例子:
publicclassPathTest
{
publicstaticvoidmain(String[]args)
{
Filefile=newFile(".\\src\\baidu");
System.out.println(file.getAbsolutePath());
try
{
System.out.println(file.getCanonicalPath());
}catch(IOExceptione)
{
e.printStackTrace();
}
}
}
getAbsolutePath()和getCanonicalPath()的不同之处在于,getCanonicalPath()得到的是一个规范的路径,而getAbsolutePath()是用构造File对象的路径+当前工作目录。例如在上面的例子中.(点号)代表当前目录。getCanonicalPath()就会把它解析为当前目录但是getAbsolutePath()会把它解析成为目录名字(目录名字是点号)。
下面是上面程序在我电脑上的输出:
G:\xhuoj\konw\.\src\baidu
G:\xhuoj\konw\src\baidu