论坛首页 综合技术论坛

java路径问题总结

浏览 15624 次
精华帖 (1) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-21   最后修改:2010-10-25

平时写程序的时候,很多时候提示文件找不到,而抛出了异常,现在整理如下

 

一 相对路径的获得
说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)
String relativelyPath=System.getProperty("user.dir");
上述相对路径中,java项目中的文件是相对于项目的根目录
web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于 tomcat安装目录\bin)


二 类加载目录的获得(即当运行时某一类时获得其装载目录)
1.1)通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录)

InputStream is=TestAction.class.getClassLoader().getResourceAsStream("test.txt");
(test.txt文件的路径为 项目名\src\test.txt;类TestAction所在包的第一级目录位于src目录下)

上式中将TestAction,test.txt替换成对应成相应的类名和文件名字即可

1.2)通用方法二 (此方法和1.1中的方法类似,不同的是此方法必须以'/'开头,参考http://riddickbryant.iteye.com/blog/436693)
InputStream is=Test1.class.getResourceAsStream("/test.txt");

(test.txt文件的路径为 项目名\src\test.txt,类Test1所在包的第一级目录位于src目录下)




三 web项目根目录的获得(发布之后)
1 从servlet出发

可建立一个servlet在其的init方法中写入如下语句
ServletContext s1=this.getServletContext();
String temp=s1.getRealPath("/"); (关键)
结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\ (002_ext为项目名字)

如果是调用了s1.getRealPath("")则输出D:\工具\Tomcat-6.0\webapps\002_ext(少了一个"\")

2 从httpServletRequest出发

String cp11111=request.getSession().getServletContext().getRealPath("/");

结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\

 

 

四 classpath的获取(在Eclipse中为获得src或者classes目录的路径)

方法一 Thread.currentThread().getContextClassLoader().getResource("").getPath()

 

eg: String t=Thread.currentThread().getContextClassLoader().getResource("").getPath();
System.out.println("t---"+t);

输出:t---/E:/order/002_ext/WebRoot/WEB-INF/classes/

 

 

 

方法二 JdomParse.class.getClassLoader().getResource("").getPath() (JdomParse为src某一个包中的类,下同)

eg:String p1=JdomParse.class.getClassLoader().getResource("").getPath();
System.out.println("JdomParse.class.getClassLoader().getResource--"+p1);

输出: JdomParse.class.getClassLoader().getResource--/E:/order/002_ext/WebRoot/WEB-INF/classes/

 

另外,如果想把文件放在某一包中,则可以 通过以下方式获得到文件(先定位到该包的最后一级目录)

eg String p2=JdomParse.class.getResource("").getPath();
System.out.println("JdomParse.class.getResource---"+p2);

输出: JdomParse.class.getResource---/E:/order/002_ext/WebRoot/WEB-INF/classes/jdom/ (JdomParse为src目录下jdom包中的类)

 

四 属性文件的读取:

方法 一

InputStream in = lnew BufferedInputStream( new FileInputStream(name));    Properties p = new Properties();   p.load(in);

 

注意路径的问题,做执行之后就可以调用p.getProperty("name")得到对应属性的值

 

方法二

Locale locale = Locale.getDefault();
ResourceBundle localResource = ResourceBundle.getBundle("test/propertiesTest", locale);
String value = localResource.getString("test");
System.out.println("ResourceBundle: " + value);

工程src目录下propertiesTest.properties(名字后缀必须为properties)文件内容如下:

test=hello word

 

   发表时间:2009-01-22  
有参考价值。
1 请登录后投票
   发表时间:2009-01-22  
恩,第二个很有用处
0 请登录后投票
   发表时间:2009-01-22  
嗯。。。。
0 请登录后投票
   发表时间:2009-01-26  
LZ,有什么方法实现在JAVA代码中(SRC下),来获取路径,而不管项目名是否为中文(比如我的工程名叫"JavaEye推荐"或工程发布后WEB服务器放在中文路径下的)?
0 请登录后投票
   发表时间:2009-02-01  
qwe1234567890 写道

LZ,有什么方法实现在JAVA代码中(SRC下),来获取路径,而不管项目名是否为中文(比如我的工程名叫"JavaEye推荐"或工程发布后WEB服务器放在中文路径下的)?

其实我是利用jvm加载类的路径来定位文件,注意你工程根目录下的.classpath文件,如我这里有一个java项目中的.class文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="classes"/>
</classpath>

它表示当java虚拟机加载类的时候从项目根目录下的classes目录去加载  如果你的文件放在classes目录下,程序自然就可以找到文件了(因为   InputStream is=TestAction.class.getClassLoader().getResourceAsStream("test.txt");  当程序运行的时候,jvm从TestAction这个类的加载路径类找文件 也就是从classes这个目录下找文件)要强调的是是从classes来加载类,而不是src目录来加载类,只不过很多的IDE工具给了我们太多的错觉,比如说Eclipse里面,当我们在写完程序保存的时候,Eclipse会自动的帮我们编译该程序,至于保存到哪里就要靠你项目根目录下的.classpath文件类决定了比如如果有
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="classes"/>
</classpath>
那你在src某一目录写一个类,保存的时候,它会把编译后的class文件(包括包的目录结构)都放到了<classpathentry kind="output" path="classes"/>指定目录,在这里也就是classes目录;但是针对一般的配置文件(非java类文件)就无所谓什么编译和编译后的class文件了,而Eclipse采取的做法就是对文件不做任何改变,直接放到classes目录下;
这样给我们的错觉就是程序从src目录下读文件,其实它是从classes目录下读文件,但是因为src和classes两个目录下的文件(一般的配置文件)内容是一模一样的,所以我们感觉不到这一点;
最后要说一下,项目名字的中文问题;
对于一般的java项目如果你的项目名字是中文的那是一点问题都没有的;
但是如果是web项目就有问题了,我这里说的是web项目的名字是中文,不是说工程发布后WEB服务器放在中文路径下;如果你仅仅是工程发布后WEB服务器放在中文路径下的那也是没有任何问题了;但如果web项目的名字是中文那就有麻烦了,比如说你的web项目名字是web项目中文目录,你现在要想访问该工程的index.jsp 那么常规的做法就是打入http://localhost:8080/web项目中文目录/index.jsp 这样显然是访问不到的,因为当你回车的时候http://localhost:8080/web项目中文目录/index.jsp是要经过编码转换的,具体如何转换在这里就不多说了,在开发中也不推荐这样,如果这样搞那也是自取麻烦!!
0 请登录后投票
   发表时间:2010-01-12  
刚做项目,想要读取src目录下的txt文件,但按照以上方法都不那么如人意,最后实在没办法了。就这样使用的:
String filePath = request.getRealPath("/")+"../classes/properties.txt";
打印结果是:
E:\taipin\50_代码开发\TP_Project\TPWeb\build\weboutput\../classes/properties.txt
最终可以找得到properties.txt文档。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics