getResource()和getResourceAsStream以及路径问题(转)
标签: 杂谈
用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file = new File("c:/test.txt");这样用有什么问题,相信大家都知道,就是路径硬编码,对于JAVA精神来说,应用应该一次成型,到处可用,并且从现实应用来讲,最终生成的应用也会部署到Windows外的操作系统中,对于linux来说,在应用中用了c:/这样的字样,就是失败,所以,我们应该尽量避免使用硬编码,即直接使用绝对路径。
在Servlet应用中,有一个getRealPath(String str)的方法,这个方法尽管也可以动态地获得文件的路径,不秘直接手写绝对路径,但这也是一个不被建议使用的方法,那么,我们有什么方法可以更好地获得文件呢?
那就是Class.getResource()与Class.getResourceAsStream()方法,但很多人还是不太懂它的用法,因为很多人(比如不久前的我)都不知道应该传怎么样的参数给它,当然,有些人己经用得如火纯青,这些人是不需要照顾的,在此仅给不会或者还不是很熟的人解释一点点。
比如我们有以下目录
|--project
|--src
|--javaapplication
|--Test.java
|--file1.txt
|--file2.txt
|--build
|--javaapplication
|--Test.class
|--file3.txt
|--file4.txt
在上面的目录中,有一个src目录,这是JAVA源文件的目录,有一个build目录,这是JAVA编译后文件(.class文件等)的存放目录
那么,我们在Test类中应该如何分别获得
file1.txt file2.txt file3.txt file4.txt这四个文件呢?
首先讲file3.txt与file4.txt
file3.txt:
方法一:File file3 = new File(Test.class.getResource("file3.txt").getFile());
方法二:File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile());
方法三:File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());
file4.txt:
方法一:File file4 = new File(Test.class.getResource("/file4.txt").getFile());
方法二:File file4 = new File(Test.class.getClassLoader().getResource("file4.txt").getFile());
很好,我们可以有多种方法选择,但是file1与file2文件呢?如何获得?
答案是,你只能写上它们的绝对路径,不能像file3与file4一样用class.getResource()这种方法获得,它们的获取方法如下
假如整个project目录放在c:/下,那么file1与file2的获取方法分别为
file1.txt
方法一:File file1 = new File("c:/project/src/javaapplication/file1.txt");
方法二:。。。没有
file2.txt
方法一:File file2 = new File("c:/project/src/file2.txt");
方法二:。。。也没有
总结一下,就是你想获得文件,你得从最终生成的.class文件为着手点,不要以.java文件的路径为出发点,因为真正使用的就是.class,不会拿个.java文件就使用,因为java是编译型语言嘛
至于getResouce()方法的参数,你以class为出发点,再结合相对路径的概念,就可以准确地定位资源文件了,至于它的根目录嘛,你用不同的IDE build出来是不同的位置下的,不过都是以顶层package作为根目录,比如在Web应用中,有一个WEB-INF的目录,WEB-INF目录里面除了web.xml文件外,还有一个classes目录,没错了,它就是你这个WEB应用的package的顶层目录,也是所有.class的根目录“/”,假如clasaes目录下面有一个file.txt文件,它的相对路径就是"/file.txt",如果相对路径不是以"/"开头,那么它就是相对于.class的路径。。
还有一个getResourceAsStream()方法,参数是与getResouce()方法是一样的,它相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果
分享到:
相关推荐
- 当使用`Class.getResource`或`Class.getResourceAsStream`时,如果路径不以 `/` 开头,那么查找将从调用该方法的类所在的包开始。 - 当使用`ClassLoader.getResource`或`ClassLoader.getResourceAsStream`时,路径...
文档提到了将`getResource("")`返回的路径转换为`URL`和`URI`对象的方法。`.toURI().getPath()`会获取路径部分,而`new URL()`可以直接构造URL对象,它们之间可以相互转换。 ### 4. 文件与URL/URI的转换 在Java中...
要访问这些资源,可以使用`ClassLoader`类的静态方法`getResource`和`getResourceAsStream`。 **示例代码**: ```java URL resource = getClass().getClassLoader().getResource("com/test/resource.txt"); ``` ...
使用 `getResource` 方法可以获取相对路径,使用 `getRealPath()` 方法可以获取绝对路径。ClassPath 路径是 Java 项目中的一个重要概念,使用它可以 guarantee 项目在开发和发布时的正确运行。在 Java Web 项目中,...
这种类型的路径在使用`ClassLoader`的`getResource`或`getResourceAsStream`方法时特别有用。 4. **相对于当前用户目录的相对路径**:这类路径基于`System.getProperty("user.dir")`返回的值。对于大多数项目而言...
在Java中,可以使用ClassLoader的`getResource()`和`getResourceAsStream()`方法,以相对路径的方式查找类路径下的资源。 四、相对于当前用户目录的相对路径 例如:相对于System.getProperty("user.dir")返回的路径...
本篇文章将详细探讨Java提供的两种主要方法:`Class.getResource`和`Class.getResourceAsStream`,用于加载类路径下的资源文件。 首先,`Class.getResource`方法返回一个`URL`对象,它表示资源的位置。这个方法接受...
- **在使用`getResource()`方法时**,如果路径不以`/`开头,则默认是从调用该方法的类的所在位置开始查找,而以`/`开头则表示从类路径的根目录开始查找。 #### 总结 通过以上分析可以看出,在Java中处理文件路径时...
- **使用 `getResource` 和 `getResourceAsStream` 方法** - 示例: - `getClass().getResourceAsStream(filePath);` (`filePath` 例如为 "/filename",默认从 WEB-INF/classes 开始查找,适用于 Tomcat 等容器...
`ClassLoader`提供了`getResource`和`getResourceAsStream`方法来获取资源的URL或输入流。例如,如果我们有一个名为`res.txt`的文件与`MyClass`同级,可以这样获取其URL: ```java URL resourceUrl = classLoader...
例如,`ClassLoader`类的`getResource(String name)`和`getResourceAsStream(String name)`方法,以及`ResourceBundle`类的`getBundle(String path)`都是基于此类路径查找资源。 然而,尽管相对路径在使用上更为...
`ClassLoader`类的`getResource(String name)`、`getResourceAsStream(String name)`等方法,以及`ResourceBundle`类的`getBundle(String path)`都支持这种方式。这种方式不仅简化了路径管理,还避免了因环境变化...
2. `getResource()`和`getResourceAsStream()`:这两个方法用于获取URL资源和对应的输入流。如果你只想读取文件内容,而不需要文件系统路径,可以使用它们。例如: ```java ServletContext context = ...
2. **使用`Thread.currentThread().getContextClassLoader().getResource("")`**: - 获取当前线程上下文类加载器的资源路径。 - 示例代码: ```java System.out.println(Thread.currentThread()....
当你需要获取与类相关的资源文件的绝对路径时,可以使用 `Class.getResource()` 或 `Class.getResourceAsStream()` 方法。这些方法返回一个 `java.net.URL` 对象,可以通过调用 `getPath()` 来获取路径字符串。例如...
1. **获取当前类的资源路径**:Java提供了一个内置的方法`getClass().getResource()`或`getClass().getResourceAsStream()`,它们可以从类路径中获取资源的URL。例如,如果你有一个名为`MyClass.class`的文件,你...
为了保证代码在其他环境中也能正常工作,建议使用绝对路径或者基于类加载器的资源获取方式(如`ClassLoader.getResource()`或`ClassLoader.getResourceAsStream()`),而不是依赖于工作空间的相对路径。这将确保你的...
而如果是在类路径中查找资源,`getResource()`和`getResourceAsStream()`更适合。对于客户端的资源,如用户上传的文件,`getParameter()`和ActionForm的属性就显得尤为重要。 总之,掌握这些获取路径的方法,能够...
总结来说,从JAR包中读取图片涉及对Java类路径的理解,以及正确使用`getResource()`或`getResourceAsStream()`方法。在实际项目中,这通常是通过封装在静态方法或工具类中,以便在多个地方复用。对于开发者来说,...