我是靠谱客的博主 糊涂烧鹅,最近开发中收集的这篇文章主要介绍getResourceAsStream() 在IntelliJ IDEA中的用法以及对返回值为null的处理方式1.IntelliJ IDEA中maven项目文件结构 2.getResourceAsStream()的几种使用方法3.总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.IntelliJ IDEA中maven项目文件结构

当我们用idea创建maven项目的时候,项目文件的结构如下图所示:

其中项目主要源代码一般放置在src/main/java文件夹下
这里将后续要用到的所有外部资源文件都放在src/main/resources文件夹下,推荐读者采用这种方式来管理文件,便于后续的讲解和文件管理。注意:对于src/main/resources文件夹下的所有文件,idea在编译后都会在src/target/classes文件夹下保留其拷贝,因此在这两个文件夹下的同名同类型文件的内容是一模一样的。

 2.getResourceAsStream()的几种使用方法


当要调用resources文件夹中的资源文件时,我们肯定想尽可能避免用到绝对路径读取文件,因为这样程序移植或者在其他设备上运行时又要重新修改绝对路径,所以可以通过getResourceAsStream()方法,使用相对路径方式读取到文件,这样在程序移植或者更换设备运行时,只需要保证将所有要调用的资源文件都放置在src/main/resources文件夹下,而不需要再修改程序本身,该方法有两种形式:

this.getClass().getResourceAsStream()

this.getClass().getClassLoader().getResourceAsStream()

以下面的项目为例,这里演示的加载1.txt文件,文件内容是Hello,world

(1)不使用ClassLoader加载文件

i.InputStream is = this.getClass().getResourceAsStream("/" + fileName)

package com.first;

import org.apache.commons.io.IOUtils;
import java.io.InputStream;

public class BJava {
    public static void main(String[] args) throws Exception {
        InputStream is = this.getClass().getResourceAsStream("/1.txt");
        String s = IOUtils.toString(is);
        System.out.println(s);
    }
}

结果:

  this.getClass().getResourceAsStream("/1.txt" )从src/target/classes文件夹下读取文件,由上面项目结构图可知文件存在,所以程序可以拿到资源,不报错。若将方法中的/去掉,则读取的是当前类所在文件夹下的文件,不存在该文件,显然报空指针异常。

ii.InputStream is = this.getClass().getResourceAsStream(fileName)

package com.first;

import org.apache.commons.io.IOUtils;
import java.io.InputStream;

public class BJava {
    public static void main(String[] args) throws Exception {
        InputStream is = this.getClass().getResourceAsStream("1.txt");
        String s = IOUtils.toString(is);
        System.out.println(s);
    }
}

结果:

this.getClass().getResourceAsStream(“1.txt")是从当前程序对应类所在的文件夹,即在src/main/java/com/first文件夹中找1.txt,该文件夹下没有1.txt,所以程序找不着,会报空指针异常。

(2)使用ClassLoader加载文件

InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName)

package com.first;

import org.apache.commons.io.IOUtils;
import java.io.InputStream;

public class BJava {
    public static void main(String[] args) throws Exception {
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("1.txt");
        String s = IOUtils.toString(is);
        System.out.println(s);
    }
}

结果:

 this.getClass().getClassLoader().getResourceAsStream("1.txt")直接从src/target/classes文件夹下读取文件,存在该文件,所以程序不报错

3.总结

(1)InputStream is = this.getClass().getResourceAsStream(fileName)

会从当前类所在的文件夹下去找,这个文件如果不和该类在一个目录下,就找不到

(2)InputStream is = this.getClass().getResourceAsStream("/" + fileName)

会从编译后的整个src/target/classes目录下去找,maven也会把资源文件打包进classes文件夹,如果该文件存在,则可以找到

(3)InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName)

会从编译后的整个src/target/classes目录下去找,文件名前不需要再加/符号,也就是说在(2)中的文件名fileName前加一个/就可以实现和(3)一样的功能
因此,当使用读取文件时,若程序报空指针异常,则笔者建议将文件全部放在src/main/resources文件夹后,再用上面(2)和(3)两种方式读取文件

 

最后

以上就是糊涂烧鹅为你收集整理的getResourceAsStream() 在IntelliJ IDEA中的用法以及对返回值为null的处理方式1.IntelliJ IDEA中maven项目文件结构 2.getResourceAsStream()的几种使用方法3.总结的全部内容,希望文章能够帮你解决getResourceAsStream() 在IntelliJ IDEA中的用法以及对返回值为null的处理方式1.IntelliJ IDEA中maven项目文件结构 2.getResourceAsStream()的几种使用方法3.总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部