class.getResource()和class.getResourceAsStream()的用法

来源:互联网 发布:迅游国际版 mac 编辑:程序博客网 时间:2024/05/23 13:52
package com.lxz;import java.io.InputStream;import org.junit.Test;public class FileDemo {@Testpublic void testFileDemo() {//getResourceAsStream:查找具有给定名称的资源。返回 inputstream//getResource:查找带有给定名称的资源路径。返回URL//在使用Class.getResourceAsStream 时,资源路径有两种方式,//一种以“/”开头,这样的路径是指绝对路径,如果不以“/”开头,则路径是相对于这个class所在的包的。//当前类com.lxz.FileDemo//a.txt文件的路径为E:\Workspace\MyEclipse\StudentManager\WebContent\WEB-INF\classInputStream absolutePath1 = this.getClass().getResourceAsStream("/a.txt");System.out.println(absolutePath1 == null ? "can't find file" : "file can use");//file can useInputStream relativePath1 = this.getClass().getResourceAsStream("a.txt");//相对路径,相对于当前类System.out.println(relativePath1 == null ? "can't find file" : "file can use");//can't find fileInputStream absolutePath2 = FileDemo.class.getResourceAsStream("/a.txt");System.out.println(absolutePath2 == null ? "can't find file" : "file can use");//file can useInputStream relativePath2 = FileDemo.class.getResourceAsStream("a.txt");System.out.println(relativePath2 == null ? "can't find file" : "file can use");//can't find file//ClassLoader的查找默认就是以classpath开始的绝对路径,不能加"/",否则会找不到文件InputStream absolutePath3 = ClassLoader.getSystemResourceAsStream("/a.txt");System.out.println(absolutePath3 == null ? "can't find file" : "file can use");//can't find fileInputStream relativePath3 = ClassLoader.getSystemResourceAsStream("a.txt");System.out.println(relativePath3 == null ? "can't find file" : "file can use");//file can use//file:/E:/Workspace/MyEclipse/StudentManager/WebContent/WEB-INF/class/System.out.println(this.getClass().getClassLoader().getResource(""));//nullSystem.out.println(this.getClass().getClassLoader().getResource("/"));//NullPointerException//System.out.println(this.getClass().getClassLoader().getResource("/").getPath());//class com.lxz.FileDemoSystem.out.println(this.getClass());//class java.lang.ClassSystem.out.println(this.getClass().getClass());////class com.lxz.FileDemoSystem.out.println(FileDemo.class);//class java.lang.ClassSystem.out.println(FileDemo.class.getClass());//a.text路径-->file:/E:/Workspace/MyEclipse/StudentManager/WebContent/WEB-INF/class/a.txtSystem.out.println("a.text路径-->" + this.getClass().getResource("/a.txt"));//a.text路径-->nullSystem.out.println("a.text路径-->" + this.getClass().getResource("a.txt"));}}

@SuppressWarnings("serial")public class FileDemoServlet extends HttpServlet {@Overridepublic void init() throws ServletException {//getRealPath(String str)这个方法可以动态地获得文件的路径,不必直接手写绝对路径,但这个是不被建议使用的方法//E:\Workspace\MyEclipse\StudentManager\WebContent\System.out.println(this.getServletContext().getRealPath("/"));//E:\Workspace\MyEclipse\StudentManager\WebContentSystem.out.println(this.getServletContext().getRealPath(""));//E:\Workspace\MyEclipse\StudentManager\WebContent\FileDemo.classSystem.out.println(this.getServletContext().getRealPath("/FileDemo.class"));//E:\Workspace\MyEclipse\StudentManager\WebContent\FileDemo.classSystem.out.println(this.getServletContext().getRealPath("FileDemo.class"));//E:\Workspace\MyEclipse\StudentManager\WebContent\com\lxz\FileDemo.classSystem.out.println(this.getServletContext().getRealPath("com/lxz/FileDemo.class"));//E:\Workspace\MyEclipse\StudentManager\WebContent\com\lxz\FileDemo.classSystem.out.println(this.getServletContext().getRealPath("/com/lxz/FileDemo.class"));//不存在的目录和文件//E:\Workspace\MyEclipse\StudentManager\WebContent\nonExistent\nonExistentFile.classSystem.out.println(this.getServletContext().getRealPath("/nonExistent/nonExistentFile.class"));//E:\Workspace\MyEclipse\StudentManager\WebContent\nonExistent\nonExistentFile.classSystem.out.println(this.getServletContext().getRealPath("nonExistent/nonExistentFile.class"));System.out.println(this.getServletConfig().getInitParameterNames());Enumeration<String> param = this.getServletConfig().getInitParameterNames();if(param.hasMoreElements()){System.out.println("初始化参数-->" + param.nextElement());}//1.在整个Servlet的生命周期中init方法仅被调用一次        //2.用户定义的Servlet中可以覆盖有参或无参的init方法,但是若覆盖有参init方法,最好先调用super.init(config),//对变量config进行赋值初始化。而覆盖无参init可以不调用super.init(),推荐覆盖无参init,为了使用方便。        //3.用户定义的Servlet中可以不去覆盖init方法,覆盖只是为了使用方便,如:获得web.xml中描述的初始化参数。//servlet初始化参数的使用非常依赖于部署描述文件(web.xml),该文件可存放servlet所需要的起始参数//以及web应用程序的结构数据。当servlet容器读取web.xml文件内容后。可以将这些起始参数封装成一个对象//并在调用init方法时传递给servlet,这个对象就是ServletConfig对象。所以我们可以在Servlet内覆写init方法,//并通过ServletCongig对象来取得某些初始参数。}@Overridepublic void init(ServletConfig config) throws ServletException {//会比init()方法先调用System.out.println("被调用");super.init(config);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();out.print("当前时间为-->" + new Date());//输出项目名/StudentManagerSystem.out.println(req.getContextPath());}}

public class Test {@org.junit.Testpublic void test(){/* ClassLoader提供了两个方法用于从装载类路径中取得资源:public URL getResource(String name);  public InputStream getResourceAsStream(String name);  这里name是资源的类路径,它是相对与“/”根路径下的位置。getResource得到的是一个URL对象来定位资源,而getResourceAsStream获得该资源输入流的引用,保证程序可以从正确的位置获取数据。但是真正使用的不是ClassLoader的这两个方法,而是Class的 getResource和getResourceAsStream方法,因为Class对象可以从你的类得到(如YourClass.class或 YourClass.getClass()),而ClassLoader则需要再调用一次YourClass.getClassLoader()方法,不过根据JDK文档的说法,Class对象的这两个方法其实是“委托”(delegate)给装载它的ClassLoader来做的,所以只需要使用 Class对象的这两个方法就可以了。因此,直接调用  this.getClass().getResourceAsStream(String name)获取流,静态化方法中则使用ClassLoader.getSystemResourceAsStream (String name) ; 。 *///file:/E:/Workspace/MyEclipse/StudentManager/WebContent/WEB-INF/class/com/lxz/System.out.println(this.getClass().getResource(""));//file:/E:/Workspace/MyEclipse/StudentManager/WebContent/WEB-INF/class/System.out.println(this.getClass().getClassLoader().getResource(""));String userDir = System.getProperty("user.dir");String userHome = System.getProperty("user.home");//userDir-->E:\Workspace\MyEclipse\StudentManager//userHome-->C:\Users\LuSystem.out.println("userDir-->" + userDir);System.out.println("userHome-->" + userHome);}}



0 0