一般我们在编写完Java程序中获取资源路径,在开发和调试期(未打包前),是没有问题的,但在打包后,由于资源(图片、配置文件等)都将打包到jar文件中,由于System中的“user.dir”属性发生了变化,会造成用绝对路径的方式无法找到jar文件中的资源文件。因为程序载入图片或文本文件时,使用以当前工作路径为基准的方式来指定文件和路径,而资源文件打在jar包中后程序无法通过绝对路径找到。因此可采用Java本身以类为基准的路径搜索方式。如下两种方式:
取得相对于包的根路径
Java Code
复制内容到剪贴板
- String path = new File(FrameConfig.class.getResource("/").getFile())
- .getAbsolutePath();
取得相对于包路径的流
Java Code
复制内容到剪贴板
- Reader reader = new InputStreamReader(
- FrameConfig.class.getResourceAsStream("/res/uiConfig.xml"));
含有这种代码的程序在运行时,以类(类路径)为基准,而不依赖当前路径(System中的user.dir),
【注】:上面的路径“/res/uiConfig.xml”是相对于包的路径,如果写成“res/uiConfig.xml”,表示相对于类的路径:package/res/uiConfig.xml,这需要将图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。
读取jar包中根Element(dom4j)
Java Code
复制内容到剪贴板
- private static Element getRootElement(String path) {
- Element rootElement = null;
- Reader reader = null;
- try {
- reader = new InputStreamReader(
- FrameConfig.class.getResourceAsStream(path));
- rootElement = new SAXReader().read(reader).getRootElement();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- closeStream(reader);
- }
- return rootElement;
- }
- private static void closeStream(Closeable stream) {
- if (stream != null)
- try {
- stream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- Element uiConfig = getRootElement("/res/uiConfig.xml");
- }
读取jar包中根Element(jdom)
Java Code
复制内容到剪贴板
- private static Element getRootElement(String path) {
- Element rootElement = null;
- Reader reader = null;
- try {
- reader = new InputStreamReader(
- FrameConfig.class.getResourceAsStream(path));
- rootElement = new SAXBuilder().build(reader).getRootElement();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- closeStream(reader);
- }
- return rootElement;
- }
读取jar包中国际化资源文件
Java Code
复制内容到剪贴板
- ResourceBundle resources = ResourceBundle.getBundle(
- "res.i18n", Locale.getDefault());
- // 取得对应的值
- String value = resources.getString(key);
读取jar包中的图片资源
Java Code
复制内容到剪贴板
- public static Image getImage(String imageName) {
- InputStream inputStream = null;
- ByteArrayOutputStream outputStream = null;
- try {
- inputStream = FrameConfig.class.getResourceAsStream("/res/images/"
- + imageName);
- outputStream = new ByteArrayOutputStream();
- byte buffer[] = new byte[1024];
- int len = 0;
- while ((len = inputStream.read(buffer)) != -1)
- outputStream.write(buffer, 0, len);
- return Toolkit.getDefaultToolkit().createImage(
- outputStream.toByteArray());
- } catch (Throwable th) {
- th.printStackTrace();
- } finally {
- closeStream(inputStream);
- closeStream(outputStream);
- }
- return null;
- }
- public static void main(String[] args) {
- Image image = getImage("add.gif");
- }
本文出自思考者日记网,转载请保留此出处!