一、先获取绝对路径再读取文件(jar包里会获取不到)
方法一:类加载器的getresource().getpath()获取目录路径
/** * 方法一:使用类加载器的getresource().getpath()获取全路径再拼接文件名,最后根据文件路径获取文件流 * 备注:jar包不可用,因为jar包中没有一个实际的路径存放文件 * * @param filename * @return * @throws filenotfoundexception */ public bufferedreader function1(string filename) throws filenotfoundexception { // /users/zunf/code/read-resource/target/classes/ string path = this.getclass().getclassloader().getresource("").getpath(); // /users/zunf/code/read-resource/target/classes/测试.txt string filepath = path + filename; return new bufferedreader(new filereader(filepath)); }
方法二:类加载器的getresource().getpath()获取文件路径
/** * 方法二:使用类加载器的getresource().getpath(),传参直接获取文件路径,再根据文件路径获取文件流 * 备注:jar包不可用,因为jar包中没有一个实际的路径存放文件 * * @param filename * @return * @throws ioexception */ public bufferedreader function2(string filename) throws ioexception { // /users/zunf/code/read-resource/target/classes/%e6%b5%8b%e8%af%95.txt string filepath = this.getclass().getclassloader().getresource(filename).getpath(); //可以看到上面读取到路径的中文被urlencoder编码了,所以需要先用urldecoder解码一下,恢复中文 filepath = urldecoder.decode(filepath, "utf-8"); return new bufferedreader(new filereader(filepath)); }
二、直接获取文件流(jar包可用)
方法三:classloader对象的getresourceasstream()
/** * 方法三:使用类加载器的getresourceasstream(),直接获取文件流 * 备注:jar包可用 * * @param filename * @return * @throws ioexception */ public bufferedreader function3(string filename) throws ioexception { //getresourceasstream(filename) 等价于getresource(filename).openstream() inputstream inputstream = this.getclass().getclassloader().getresourceasstream(filename); if (inputstream == null) { throw new filenotfoundexception(filename); } return new bufferedreader(new inputstreamreader(inputstream)); }
方法四:class对象的getresourceasstream()
- classloader 的getresource()是从类路径的根路径查找的,所以不加“/”也可以
- class 的getresource()是从当前类所在的包路径查找资源,所以如果不加“/”表示去根路径查找的话,是找不到的
/** * 方法四:使用class对象的getresourceasstream()获取文件流 * 备注:jar包可用 * * @param filename * @return * @throws ioexception */ public bufferedreader function4(string filename) throws ioexception { //getresourceasstream(filename) 等价于getresource(filename).openstream() inputstream inputstream = this.getclass().getresourceasstream("/" + filename); if (inputstream == null) { throw new filenotfoundexception(filename); } return new bufferedreader(new inputstreamreader(inputstream)); }
三、使用封装好的类(jar包可用)
源码里还是方法三、方法四,只不过做了一些封装,更方便开发
方法五:spring提供的classpathresource
/** * 方法五:使用spring提供的classpathresource获取 * 备注:jar包可用 * * @param filename * @return * @throws ioexception */ public bufferedreader function5(string filename) throws ioexception { classpathresource classpathresource = new classpathresource(filename); inputstream inputstream = classpathresource.getinputstream(); return new bufferedreader(new inputstreamreader(inputstream)); }
方法六:hutool提供的resourceutil
/** * 方法六:使用hutool的resourceutil * 备注:jar包可用 * * @param filename * @return * @throws ioexception */ public bufferedreader function6(string filename) throws ioexception { list<url> resources = resourceutil.getresources(filename); url resource = resources.get(0); return new bufferedreader(new inputstreamreader(resource.openstream())); }
四、测试jar包中是否可用的代码
1)编写接口
//jar包启动时根据传入的不同funcation值来选择调用哪个方法测试 @value("${function}") private int function; @getmapping("/test") public string test() throws ioexception { //需要在resource里读取的文件 string filename = "测试.txt"; //调用方法 system.out.println("调用function" + function); bufferedreader bufferedreader = null; switch (function) { case 1: bufferedreader = function1(filename); break; case 2: bufferedreader = function2(filename); break; case 3: bufferedreader = function3(filename); break; case 4: bufferedreader = function4(filename); break; case 5: bufferedreader = function5(filename); break; case 6: bufferedreader = function6(filename); break; default: } //读取并输出 stringbuilder sb = new stringbuilder(); string line = null; while ((line = bufferedreader.readline()) != null) { sb.append(line).append("\n"); } system.out.println(sb); return sb.tostring(); }
2)启动jar包指令
java -jar -dfunction=6 read-resource-1.0-snapshot.jar
- 更改
-dfunction=6
的值就能动态切换方法了。
到此这篇关于springboot项目中读取resource目录下的文件六种方法的文章就介绍到这了,更多相关springboot读取resource文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论