
最近搞了一个springboot的项目,但是在项目部署的时候遇到一个问题:就是我将项目导出为war包,然后用java -jar 运行时,项目中文件上传的功能无法正常运行,其中获取到存放文件的目录的绝对路径的值为空,文件无法上传,试了很多方法 貌似是因
java项目中文件的路径-方法大全
一、 相对路径的获得
说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)
SystemgetProperty("userdir");
上述相对路径中,java项目中的文件是相对于项目的根目录web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于tomcat安装目录\bin)
二 类加载目录的获得(即当运行时某一类时获得其装载目录)
11)通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录)
InputStreamis=TestActionclassgetClassLoader()getResourceAsStream("testtxt"); (testtxt文件的路径为 项目名\src\testtxt;类TestPath所在包的第一级目录位于src目录下)
上式中将TestPath,testtxt替换成对应成相应的类名和文件名字即可
12)通用方法二 (此方法和11中的方法类似,不同的是此方法必须以'/'开头) InputStream is=Test1classgetResourceAsStream("/testtxt");
(testtxt文件的路径为 项目名\src\testtxt,类Test1所在包的第一级目录位于src目录下)
三 web项目根目录的获得(发布之后)
1 从servlet出发
可建立一个servlet在其的init方法中写入如下语句(没有请求的话会抛空指针导常)
ServletContext s1=thisgetServletContext();
String temp=s1getRealPath("/"); (关键)
结果形如:F:\tomcat-6036\webapps\test\(test为项目名字)
如果是调用了s1getRealPath("")则输出F:\tomcat-6036\webapps\test(少了一个"\")
2 从>
String path=requestgetSession()getServletContext()getRealPath("/");
结果形如: F:\tomcat-6036\webapps\test\
四 classpath的获取(在Eclipse中为获得src或者classes目录的路径),放在监听器,可以窗口启动获取路径
方法一 ThreadcurrentThread()getContextClassLoader()getResource("")getPath()
String path = ThreadcurrentThread()getContextClassLoader()
getResource("")getPath();
Systemoutprintln("path========" + path);输出: path========/F:/tomcat-6036/webapps/test/WEB-INF/classes/
方法二 JdomParseclassgetClassLoader()getResource("")getPath() (JdomParse为src某一个包中的类,下同)
eg:String p1=JdomParseclassgetClassLoader()getResource("")getPath();
Systemoutprintln("JdomParseclassgetClassLoader()getResource--"+p1);
输出:JdomParseclassgetClassLoader()getResource-/F:/tomcat-6036/webapps/test/WEB-INF/classes/
另外,如果想把文件放在某一包中,则可以 通过以下方式获得到文件(先定位到该包的最后一级目录)
eg String p2=JdomParseclassgetResource("")getPath();
Systemoutprintln("JdomParseclassgetResource---"+p2);
输出:JdomParseclassgetResource--/F:/tomcat-6036/webapps/test/WEB-INF/classes/
(JdomParse为src目录下jdom包中的类)
四 属性文件的读取:
方法 一
InputStream in = lnewBufferedInputStream( new FileInputStream(name));
Properties p = new Properties(); pload(in);
注意路径的问题,做执行之后就可以调用pgetProperty("name")得到对应属性的值
方法二
Locale locale =LocalegetDefault();
ResourceBundle localResource = ResourceBundlegetBundle("test/propertiesTest",locale);
String value = localResourcegetString("test");
Systemoutprintln("ResourceBundle: " + value);
工程src目录下propertiesTestproperties(名字后缀必须为properties)文件内容如下:
test=hello word
不通过Servlet获取路径
第一种实现
Java代码
URL url = ClassLoadergetSystemClassLoader()getResource("/");
File file =new File(urlgetPath());
File parentFile =new File(filegetParent());
Systemoutprintln("webRoot:"+parentFilegetParent());
第二种实现
首先写一个接听类 (推荐使用,容器启动时就执行,不会抛空指针异常,适合做定时器任务来删除服务器文件的路径)
Java代码:
package comchinacreatorreportlistener;
import javaxservletServletContext;
import javaxservletServletContextEvent;
import javaxservletServletContextListener;
/
@authorxiaoqunyi
/
public class PathListener implementsServletContextListener {
private staticServletContext servletContext;
public voidcontextDestroyed(ServletContextEvent sce) {
thisservletContext= scegetServletContext();
Systemoutprintln("path=======:"+servletContextgetRealPath("/"));
}
public voidcontextInitialized(ServletContextEvent arg0) {
}
}
在webxml中加入如下配置
Java代码 :
<listener>
<listener-class>comchinacreatorreportlistenerPathListener</listener-class>
</listener>
五、Java中的getResourceAsStream有以下几种:
1 ClassgetResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由 ClassLoader(类加载器)(获取资源)
2 ClassgetClassLoadergetResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
3 ServletContext getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。
4 Jsp下的application内置对象就是上面的ServletContext的一种实现。
其次,getResourceAsStream 用法大致有以下几种:
第一: 要加载的文件和class文件在同一目录下,例如:comxy 下有类meclass ,同时有资源文件myfilexml
那么,应该有如下代码:
meclassgetResourceAsStream("myfilexml");
第二:在meclass目录的子目录下,例如:comxy 下有类meclass ,同时在 comxyfile 目录下有资源文件myfilexml
那么,应该有如下代码:
meclassgetResourceAsStream("file/myfilexml");
第三:不在meclass目录下,也不在子目录下,例如:comxy 下有类meclass ,同时在 comxfile 目录下有资源文件myfilexml
那么,应该有如下代码:
meclassgetResourceAsStream("/com/x/file/myfilexml");
总结一下,可能只是两种写法
第一:前面有 “ / ”
“ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject
meclassgetResourceAsStream("/com/x/file/myfilexml");
第二:前面没有 “ / ”
代表当前类的目录
meclassgetResourceAsStream("myfilexml");
meclassgetResourceAsStream("file/myfilexml");
你可以从request中获取到他工程的根路径 然后再加上你自己的upload文件夹和里面的具体文件的路径就可以了
例如:requestgetServletContext()getRealPath("/"),可以取到根路径,即工程的名称那个文件夹的路径,然后后面怎么写你应该就知道了
1,生成3个目录/lib,/conf,/bin目录
2,把所有的jar目录编译、拷贝到/lib目录(包括maven的jar包和lib目录下的jar,以及编译的jar包)
3,把所有的启动脚本从工程根目录拷贝到/bin目录
4,把所有的配置文件从src/main/resources拷贝到/conf
pomxml 配置
<project xmlns=">
1 右键普通Java项目,在d出的菜单中选择[Configure]-[Convert to Maven Project]:
2 在d出的对话框中输入项目的groupId, artifactId和version等,点击[Finish],在根目录下生成maven的pomxml文件。
3 经过IDE转换的maven项目还不能满足要求,需要手动配置:
a 将pomxml的根节点声明设置为最新版本,如:
Xml代码
<project xmlns=">
这里面我把se跟ee方面获取路径的给你列举出来了,希望对你有用
Java中使用的路径,分为两种:绝对路径和相对路径。归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!
在开发Web方面的应用时, 经常需要获取服务器中当前WebRoot的物理路径。
如果是Servlet , Action , Controller, 或者Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通过ServletContextgetRealPath("/")来获取当前应用在服务器上的物理地址。
如果在类中取不到ServletContext时,有两种方式可以做到:
1)利用Java的类加载机制:调用 XXXclassgetClassLoader()getResource(""); 方法来获取到ClassPath , 然后处理获得WebRoot目录。
这种方式只能是该class在WebRoot/WEB-INF/classes下才能生效, 如果该class被打包到一个jar文件中, 则该方法失效。这时就应该用下面一种方式。
2)spring框架的思路,在WEB-INF/webxml中,创建一个webAppRootKey的param,指定一个值(默认为webapproot)作为键值,然后通过Listener, 或者Filter,或者Servlet 执行String webAppRootKey = getServletContext()getRealPath("/"); 并将webAppRootKey对应的webapproot 分别作为Key,Value写到System Properties系统属性中。之后在程序中通过SystemgetProperty("webapproot")来获得WebRoot的物理路径。
根据第二种的思路,我们还可以再扩展一下。不过对于在部署在一台服务器中的应用来说,若还不是你所需请再往下看。
下面是一些得到classpath和当前类的绝对路径的一些方法。你可使用其中的一些方法来得到你需要的资源的绝对路径:
1DebitNoteActionclassgetResource("")
得到的是当前类FileTestclass文件的URI目录。不包括自己!
如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
atacarnet/src/com/evi/modules/atacarnet/action/
2DebitNoteActionclassgetResource("/")
得到的是当前的classpath的绝对URI路径。
如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
3ThreadcurrentThread()getContextClassLoader()getResource("")
得到的也是当前ClassPath的绝对URI路径
如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
推荐使用该方法获取。
4DebitNoteActionclassgetClassLoader()getResource("") 或ClassLoadergetSystemResource("")
得到的也是当前ClassPath的绝对URI路径。
如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
5取得服务器相对路径
SystemgetProperty("userdir")
例如:E:\apache-tomcat-5516\apache-tomcat-5516\bin
6取得项目中的绝对路径
一般用requestgetRealPath("/")或requestgetRealPath("/config/")
但现在不提倡使用requestgetRealPath("/")了,大家可试用ServletContextgetRealPath("/")方法得到Web应用程序的根目录的绝对路径。
要取得src的文件非常容易,因为src是默认的相对目录,比如你说要取得src下com目录的testjava文件,你只需要这样就够了
File f = new File(com/testjava);
但如果我要取得不在src目录或者WebRoot目录下的文件呢,而是要从src或者WebRoot同级的目录中取呢,比如说doc吧。
我的硬方法是这样实现的:
String path = thisgetServletContext()getRealPath("/");
Properties p = new Properties();
pload(new FileInputStream(new File(pathsubstring(0,(pathlastIndexOf("\\WebRoot") + 1)) + "doc/dbproperties")));
Systemoutprintln(pgetProperty("driverName"));
-------------------------------
另:Request中getContextPath、getServletPath、getRequestURI、getRequestURL、getRealPath的区别
假定你的web application 名称为news,你在浏览器中输入请求路径:>
以上就是关于springboot怎么获取工程资源路径全部的内容,包括:springboot怎么获取工程资源路径、java项目中文件的路径、我的javaEE项目的spring mvc controller里如何获取某个文件夹的路径呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)