【问题标题】:ClassLoader - Loading and saving dataClassLoader - 加载和保存数据
【发布时间】:2013-03-07 20:35:08
【问题描述】:

希望有人可以帮助我。

据我了解,使用 ClassLoader 是加载内容的最可靠方式。

public class Pipeline{
   public static URL getResource(String filename) {
      return ClassLoader.getSystemResource(filename);
   }

   public static InputStream getResourceAsStream(String filename) {
      return ClassLoader.getSystemResourceAsStream(filename);
   }
}

如果您在“[jar bundle]/resources/abc.png”中有一个文件..您将通过以下方式加载它:

URL url = Pipeline.getResource("resources/abc.png"); 

加载很简单。
储蓄是我的动力。

我有一个程序在运行时收集数据,在退出时保存该数据,然后在下次加载数据并继续添加。

我认为最简单的解决方案是保存回 jar 包中,以便 ClassLoader 可以获取它们。这甚至可能吗?还是推荐?

我不介意将我的资源放在 jar 之外,只要我不必求助于“文件”来获取它们并保存到它们。 (除非它可以干净地完成)

folder/application.jar

folder/resources/abc.png

如果您可以 ../ 从 ClassLoader 正在查找的位置返回一个,那么从实际包含 jar 文件的目录中干净地获取数据会很容易

Pipeline.getResource("../resources/abc.png");

有什么想法吗?

【问题讨论】:

    标签: resources classloader loading save data-management


    【解决方案1】:

    这并不是类加载器的真正用途。从类加载器加载资源意味着您可以将应用程序捆绑为一个包,并且组件可以相互读取,而不必担心您要部署到的系统是如何设置的。

    如果 JAR 中的文件打算由应用程序更改,那么它不是应用程序的一部分,因此可能不应该在 JAR 中。

    我没有太多关于您的应用的上下文,但希望我的建议对您的情况有效。

    我建议在您的应用程序中设置一个要求,即它有一个允许对其进行读写的工作区域,并接受指定此目录所在位置的配置设置。在 Java 中执行此操作的典型方法是使用环境变量、系统属性或 JNDI 设置(用于容器部署)。

    例子:

    1. Tomcat 的启动脚本会确定它的安装位置并设置名为 catalina.home 的系统属性,并允许您使用名为 CATALINA_HOME 的环境变量覆盖它。
    2. JBoss 查找 JBOSS_HOME
    3. Java 应用程序服务器通常会查找 JAVA_HOME 来查找 JDK。

    【讨论】:

    • 对,所以如果我只需要将一些资源与应用程序捆绑在一起就可以运行。然后 ClassLoader 可以很好地加载它们,但是如果我需要将数据添加到资源中,那么我应该有一个用于数据的外部工作区。我将查看您的示例并找到适合我的解决方案。干杯~!
    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2021-10-19
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多