`
thinkblog
  • 浏览: 90668 次
文章分类
社区版块
存档分类
最新评论

Java中getResourceAsStream的用法[1]

 
阅读更多

今天写代码的时候发现一个有趣的问题,就是在代码中读取一些资源文件(txt,gif等等)时候,单独运行的时候,当然没问题,但是当我们将项目打包成jar后,尽管资源文件在jar包内,但我们却怎么也访问不到它了。

代码结构如下:

Java代码收藏代码
  1. src|---com
  2. ---cn
  3. ---ChineseUtil.java
  4. src|---pinyin.txt

ChineseUtil.java

Java代码收藏代码
  1. packagecom.cn;
  2. importjava.io.FileInputStream;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.IOException;
  5. importjava.io.InputStream;
  6. importjava.net.URL;
  7. importjava.util.Properties;
  8. publicclassChineseUtil{
  9. privatePropertiesproperties;
  10. publicChineseUtil(){
  11. this.properties=loadProperties("pinyin.txt");
  12. }
  13. /**
  14. *加载资源文件
  15. *@paramfile
  16. *@return
  17. */
  18. privatePropertiesloadProperties(Stringfile){
  19. Propertiesp=newProperties();
  20. URLurl=this.getClass().getResource("/"+file);
  21. System.out.println(url.getPath());//输出文件路径
  22. try{
  23. p.load(newFileInputStream(url.getFile()));
  24. }catch(FileNotFoundExceptione){
  25. e.printStackTrace();
  26. }catch(IOExceptione){
  27. e.printStackTrace();
  28. }
  29. returnp;
  30. }
  31. }

在本工程下,测试代码如下:

Java代码收藏代码
  1. publicclassPinyinTest{
  2. publicstaticvoidmain(String[]args){
  3. ChineseUtilutil=newChineseUtil();
  4. }
  5. }

测试一切正常,没有抛出异常,但是当我们将该项目打包成jar,新建一个java工程,并仍然采用上面的java代码进行测试时,却发现代码抛出异常:

Java代码收藏代码
  1. file:/D:/frame/pinyin.jar!/pinyin.txt
  2. <spanstyle="color:#ff0000;">java.io.FileNotFoundException:file:\D:\frame\pinyin.jar!\pinyin.txt(文件名、目录名或卷标语法不正确。)</span>

抛出异常了,找不到资源文件了!让我们注意一下输出的文件的路径,file:\D:\frame\pinyin.jar!\pinyin.txt,和一般的文件路径相比,多了一个!,你不仔细观察,是看不出来的!查阅了相关资料,原来jar包中文件URL有专用格式的:jar:<url>!/{entry},而我们是不能以这种形式来new一个File的,那该怎么做呢,我们把 loadProperties方法修改如下:

Java代码收藏代码
  1. privatePropertiesloadProperties(Stringfile){
  2. Propertiesp=newProperties();
  3. //注意加载资源文件的写法/表示从根目录开始否则就表示从当前类所在的路径下开始
  4. InputStreamis=this.getClass().getResourceAsStream("/"+file);
  5. try{
  6. p.load(is);
  7. }catch(FileNotFoundExceptione){
  8. e.printStackTrace();
  9. }catch(IOExceptione){
  10. e.printStackTrace();
  11. }
  12. returnp;
  13. }

即通过通过Class类的getResourceAsStream()方法来获取文件,这个方法是透明的,你可以像普通的File一样去定位jar包中的资源文件(不管你是jar文件还是普通的文件夹)。另外还有一个比较让人纠结的方式是使用java.util.jar.JarFile类才访问,不过使用起来非常的不习惯,具体大家可以参考API试试。

PS:接下来该看看底层是怎么实现了,有经验的朋友不妨说说

分享到:
评论

相关推荐

    Java中getResourceAsStream的用法.md

    Java中getResourceAsStream的用法.md

    Java中getResourceAsStream用法分析

    在Java编程中,`getResourceAsStream` 是一个非常实用的方法,用于从类路径或者特定上下文中获取资源流,通常用来读取配置文件、图片、XML文档等静态资源。这个方法在处理与代码打包在一起的非代码文件时非常方便。...

    Java 使用getClass().getResourceAsStream()方法获取资源

    在Java编程中,`getClass().getResourceAsStream()`是一个非常实用的方法,用于从类路径(Classpath)中加载资源,如配置文件、图片、字体等。这个方法返回一个`InputStream`对象,可以通过它读取到资源文件的内容。...

    java项目中获取路径详解

    在 Java 项目中,读取包内文件可以使用 `getResourceAsStream` 方法。例如,`InputStream in = ReadFile.class.getResourceAsStream("/com/lavasoft/res/a.txt");` 可以读取包内的文件 `a.txt`。 Java Web 项目中...

    Java工程中资源文件的用法

    ### Java工程中资源文件的用法详解 #### 概述 资源文件,通常指的是`.properties`文件,这类文件采用键值对的形式存储数据,广泛应用于Java项目中存储配置信息、国际化字符串等。通过使用`java.util.Properties`类...

    java读取项目中的文件(src目录下)

    使用`getResource()`或`getResourceAsStream()`方法能更好地适应这些变化。 7. **异常处理**: - 在尝试读取文件时,应该始终处理可能出现的异常,如`FileNotFoundException`,确保程序在文件不存在或无法访问时...

    java文件路径获取

    本文将详细介绍Java中获取文件路径的各种方法及其应用场景,帮助开发者更好地理解和掌握这些技巧。 #### 二、基本概念 在深入讨论之前,我们需要了解几个基本概念: - **Classpath**: 是Java运行环境的一个重要...

    java读取资源文件

    总之,Java提供了多种方式来读取项目中的资源文件,通过理解类路径和使用适当的IO方法,可以有效地在IDEA环境中加载和处理这些资源,无论是文本、音频还是图片。确保在实际应用中适当地管理和关闭资源,以保持程序的...

    java类读取配置文件信息

    在Java类中,读取配置文件信息可以使用多种方法,其中一种方法是使用`this.getClass().getClassLoader().getResourceAsStream`方法。 `this.getClass().getClassLoader().getResourceAsStream`方法是Java类中的一种...

    java Swing读取图片

    在Java中,我们通常使用`ImageIcon`类的构造函数来加载图片。以下代码展示了如何从文件系统中加载图片: ```java String imagePath = "path/to/your/image.jpg"; ImageIcon imageIcon = new ImageIcon(imagePath);...

    在Java程序中获取当前运行程序的路径

    首先,我们可以通过`java.lang.Class`类的`getResource`或`getResourceAsStream`方法来获取类路径中的资源文件路径。这两个方法都是在类路径中查找资源,返回一个URL对象,从中可以获取路径信息。例如,如果我们有一...

    Java实现从jar包中读取指定文件的方法

    此外,如果你需要频繁地从JAR中读取资源,可以考虑使用`Class.getResourceAsStream()`或`ClassLoader.getResourceAsStream()`方法,它们允许你通过类路径(相对于类或类加载器)访问资源,而无需显式打开`JarFile`。...

    java-loadresource.rar

    本篇文章将详细探讨Java提供的两种主要方法:`Class.getResource`和`Class.getResourceAsStream`,用于加载类路径下的资源文件。 首先,`Class.getResource`方法返回一个`URL`对象,它表示资源的位置。这个方法接受...

    JAVA基于SnakeYAML实现解析与序列化YAML

    例如,可以在YAML文档中定义嵌套的对象,然后使用Yaml类的load()方法将其加载到Java对象中。 结论 JAVA基于SnakeYAML实现解析与序列化YAML是JAVA开发中的一种常见需求。通过使用SnakeYAML库,可以轻松地将YAML文档...

    Java加载properties文件的六种方法

    1. **使用 `java.util.Properties` 类的 `load()` 方法** 这是最直接的方法,通过 `FileInputStream` 创建输入流,然后用 `Properties` 类的 `load()` 方法加载内容。示例代码如下: ```java InputStream in = ...

    JAVA获取各种路径总结

    - **使用 `getResource` 和 `getResourceAsStream` 方法** - 示例: - `getClass().getResourceAsStream(filePath);` (`filePath` 例如为 "/filename",默认从 WEB-INF/classes 开始查找,适用于 Tomcat 等容器...

    在Java中如何利用Applet来加载图像

    若图像文件被打包在JAR中,可以使用`getResourceAsStream()`方法读取: ```java InputStream inObject = getClass().getResourceAsStream("image.gif"); byte[] buffer = new byte[inObject.available()]; for (int...

    java操作properties方法

    1. **读取Properties文件**:使用`Properties`类的`load()`方法可以从输入流中加载`.properties`文件内容。例如,在`readPropertiesFile`方法中,通过`FileInputStream`创建输入流,并将其传递给`properties.load...

    java中File的相对路径与绝对路径总结

    - 注意点:使用`getResourceAsStream()`方法时,路径必须以`/`开头,这表示从类路径的根目录开始查找。 #### 绝对路径的应用场景 1. **基于bin目录下的文件访问**: - 假设项目的编译输出目录为`bin`,且文件...

Global site tag (gtag.js) - Google Analytics