Java 获取Resource目录下的文件 java获取resource文件路径
liebian365 2024-10-19 08:09 21 浏览 0 评论
Java 获取Resource目录下的文件
有两种方式:
Java代码中的类,要获取Resource资源文件目录下文件
绝对路径寻址
注意这个 / 址的是根目录,用绝对路径,可能会出现的问题是,你的程序在windows上可以用,但是在linux不能用,原因在于,你这根目录在windows环境址你的src目录
放到linux环境,就可能执行你linux的根目录了,会导致 file not exist
针对上面的问题,可以考虑相对路径寻址:
例子:
项目需要在 resource目录下面放一个hadoop 包, 这包远程提交到集群上运行,
上面就采用了相对路径
根据该路径,可以找到对应的hadoop.jar文件。
java中jar包内的类访问jar包内部的资源文件的路径问题
在本地项目中,若我们要访问项目中的资源文件,则一般使用相对路径或者用System.getProperities("user.dir")得到项目根目录,然后再访问资源文件,但是在将该工程和资源文件打包为jar包,运行该jar文件时,会显示找不到资源文件的错误。
在如下项目结构树中,项目根目录为nlpir,如果我们要在src下的某个package的某个java文件中访问blackWhite文件夹中的文件,则相对路径为"blackWhite/....."即可。但是在打包为jar包时,即使我们把blackWhite文件夹同样加入到打包的文件行列,在运行该jar包时,会出错:找不到blackWhite中某文件的路径。
解决方法:使用Class.getResource或者是ClassLoader.getResourceAsStream()将文件内容放到InputStream中,具体使用如下:
或者为:
注意,使用class的getRescource时,要注意路径前要加"/",即根目录,此处的根目录是src
若像如下使用:
则会出错如下:
使用ClassLoader时,如下:
在使用ClassLoader时,路径前面不能加"/",使用相对路径。如下示例:
结果如下:
如下代码:
运行结果如下:
其中,File.getParentFile()可用于求父目录
将上述readProperties函数打包为jar包在命令行使用java -jar TempTest.jar运行时,结果如下:
由此可见,打包成jar包时和在ide中直接运行的结果并不一样,所以在jar包中的class类要访问自己jar包中的资源文件时,应该使用Class.getResource或者是getResourceAsStream放在InputStream中,再进行访问。但是该方法只能访问到src下的资源文件,因为其根目录对应的就是src,无法访问到项目根目录下src外的文件,如上述项目结构图中的blackWhite中的文件无法访问到,解决方法还木有找到。。。。。。
当jar包外部的类需要访问某个jar包的资源文件时,使用JarFile类,具体使用方法如下:
如果你对于常用的ZIP格式比较熟悉的话,JAR文件也就差不多。JAR文件提供一种将多个文件打包到一个文件中的方法,其中每一个文件可能独立地被压缩。JAR文件所增加的内容是manifest,它允许开发者可以提供附加的关于内容的信息。例如,manifest表明JAR文件中的哪个文件是用来运行一个程序的,或者库的版本号等。
J2SEDK提供了一个JAR工具,你可以用它从控制台读写JAR文件。然而,如果你需要在程序中代码读写JAR文件,可能需要一点时间(本文只包含如何在程序中读写JAR文件)。好消息是你可以做到这一点,而且你不用担心解压的事,因为类库将帮助你完成这些。
首先,通过把将JAR文件位置传给构造函数,创建一个JarFile的实例,位置可能是String或File的形式,如下:
JarFile jf = new JarFile("C:/jxl.jar");
或者为:
File file = new File("C:/jxl.jar"); JarFile jarFile = new JarFile(file);
你可能注意到当文件不在class path中时,JarFile类对于从JAR中读取文件文件是很有用的。当你想指定目标JAR文件时,JarFile类对于从JAR中读取文件同样也很有用。
当然,如果JAR文件在class path中,从其中读取文件的方法比较简单,你可以用下面的方法:
URL url = ClassLoader.getSystemResource(name);
或者为:
InputStream stream = ClassLoader.getSystemResourceAsStream("javax/servlet/LocalStrings_fr.properties");
当你有了该JAR文件的一个引用之后,你就可以读取其文件内容中的目录信息了。JarFile的entries方法返回所有entries的枚举集合 (Enumeration)。通过每一个entry,你可以从它的manifest文件得到它的属性,任何认证信息,以及其他任何该entry的信息,如它的名字或者大小等。
Enumeration enu = jf.entries(); while (enu.hasMoreElements()) { JarEntry element = (JarEntry) enu.nextElement(); String name = element.getName(); Long size = element.getSize(); Long time = element.getTime(); Long compressedSize = element.getCompressedSize(); System.out.print(name+"/t"); System.out.print(size+"/t"); System.out.print(compressedSize+"/t"); System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(new Date(time))); }
为了从JAR文件中真正读取一个指定的文件,你必须到其entry的InputStream。这和JarEntry不一样。这是因为JarEntry只是包含该entry的有关信息,但是并不实际包含该entry的内容。这和File和FileInputStream的区别有点儿相似。访问文件没有打开文件,它只是从目录中读取了该文件的信息。下面是如何得到entry的InputStream:
InputStream input = jarFile.getInputStream(entry);
当你有了输入流,你就可以像读取其他流一样读取它。在文本流中(text stream),记得使用读取器(Reader)从流中取得字符。对于面向字节的流,如图片文件,直接读取就行了。
示例:
下面的程序演示如何从JAR文件中读取文件。指定JAR文件的名称,要读取的文件的名称(打包JAR文件中的某一个文件)作为参数来调用该程序。要读取的文件应该有一个文本类型的。
import java.io.*; import java.util.jar.*; public class JarRead { public static void main (String args[]) throws IOException { if (args.length != 2) { System.out.println( "Please provide a JAR filename and file to read"); System.exit(-1); } JarFile jarFile = new JarFile(args[0]); JarEntry entry = jarFile.getJarEntry(args[1]); InputStream input = jarFile.getInputStream(entry); process(input); jarFile.close(); } private static void process(InputStream input) throws IOException { InputStreamReader isr = new InputStreamReader(input); BufferedReader reader = new BufferedReader(isr); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); } }
假设在myfiles.jar文件中有一个spider.txt文件,spider文件的内容如下:
The itsy bitsy spider Ran up the water spout Down came the rain and Washed the spider out
可以通过下面的命令在命令行来显示该文本文件的内容:
java JarRead myfiles.jar spider.txt
---------------------
版权声明:本文为CSDN博主「mm_bit」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mm_bit/article/details/50372229
相关推荐
- 看黑客是如何获取你电脑最高权限的,一定要看
-
在渗透过程中,通过各种方式获取到一枚cmdshell,但是这个shell的权限比较低,无法让我们做我们想要做的一些操作,比如说获取系统密码,获取数据库信息,又或者比如说拿到服务器中的另一个站点的权限,...
- 是50个常用的Visual Basic代码示例:
-
以下是50个常用的VisualBasic代码示例:1.声明变量```vb...
- 电脑系统型号怎么看版本(如何看电脑系统型号)
-
有时候我们会需要进行查看电脑上安装的windows系统版本及系统版本号,但对于不懂电脑知识的小白来说要怎么查看电脑系统版本信息呢?别着急,有小编在接下来,就将查看电脑系统版本的教程来分享给你们,希望对...
- dos命令systeminfo,查看系统启动时间。电脑卡慢,win10怎么了?
-
最近一段时间,有几个反应电脑卡慢的,都是windows10的系统。询问得知每天电脑有关机,打开任务管理器,内存使用量达到百分之九十多,而程序只打开微信、wps、360浏览器。cmd窗口运行命令syst...
- systeminfo命令:全面解析系统信息!
-
你是否曾想过,仅凭一条简单的命令,就能深入了解计算机的"内心世界"?是不是有点不可思议?那么,让我们一起探寻这个神奇的命令,揭开它背后的奥秘吧!它能提供的信息超乎你的想象,从操作系统到硬件配置,再到驱...
- 电脑序列号怎么查询?只需两行命令一键查询
-
当我们的电脑出问题需要保修的时候,需要查询到电脑的型号和序列号才更便于进行下一步的操作,有包装盒的朋友还可以在包装盒上查询,笔记本用户可以在电脑底部标签上查询,没有包装盒和标签破损的用户就无从下手了。...
- 快速显示系统信息:Systeminfo命令详解
-
Systeminfo命令是windows系统中显示系统信息的命令,此命令可以显示出计算机的操作系统的详细配置信息,包括操作系统配置、安全信息、产品ID和硬件属性(如RAM、磁盘空间和网卡)。使用...
- dos命令systeminfo图文教程,显示操作系统配置信息msinfo32
-
大家好,我是老盖,首先感谢观看本文,本篇文章做的有视频,视频讲述的比较详细,也可以看我发布的视频。今天我们学习systeminfo命令,该工具显示本地或远程机器(包括服务包级别)的操作系统配置的信息,...
- 基于uniapp+vue3跨端仿制chatgpt实例uniapp-chatgpt
-
#夏日生活打卡季#...
- 原创新作uniapp+vue3+pinia2高仿微信App聊天
-
前段时间有给大家分享一个flutter3.x桌面端os系统。今天再分享一款最新原创之作uniapp-vue3-wechat聊天实例。uni-vue3-wechat采用...
- UniApp开发的设备适配(uniapp服务器配置)
-
UniApp是一个跨平台开发框架,支持多端应用(如H5、小程序、iOS、Android等)。由于不同设备的屏幕尺寸、分辨率、操作系统等存在差异,设备适配是开发过程中需要重点关注的问题。以下是Uni...
- 如何用服务器搭建自己的个人网站(自己服务器怎么做网站)
-
这篇教程主要是告诉大家如何利用TCP和HTTP协议来完成网站的搭建。首先你需要有C/C++语言基础,且有服务器、客户端概念,如果你了解TCP或者HTTP协议的话,那么将会帮助你更快的学会如何搭建个人网...
- 大话C语言:字符数组(c语言字符数组教学视频)
-
1字符数组概述C语言中没有字符串这种数据类型,可以通过char的数组来替代。数字0(和字符'\0'等价)结尾的char数组就是一个字符串,字符串是一种特殊的char的数组。...
- 源码分享:在pdf上加盖电子签章(pdf怎么加电子签章)
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- C语言wcstombs函数详解:宽字符字符串到多字节的「翻译官」
-
核心定位wcstombs是C语言中用于将宽字符字符串转换为多字节字符串的「翻译官」,它能将宽字符(wchar_t)转换为多字节字符(如UTF-8编码的中文)。就像一位翻译官,它能将一种语言(宽字符...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)