2009-11-07 25 views
2

当我加载一些数据到我的java程序时,我通常使用FileInputStream。但是我将程序部署为jar文件和webstart,所以我必须使用getRessource()或getRessourceAsStream()直接从jar文件加载数据。从部署过程中的JAR文件加载与开发

现在总是在开发和部署之间切换此代码是非常烦人的?

有没有办法自动执行此操作?即有办法知道代码是否从jar中运行?

当我尝试加载它withoug罐子这样的:

InputStream is = this.getClass().getResourceAsStream("file.txt"); 

返回的InputStream简直是零,虽然文件肯定是在应用程序的根目录。

谢谢!

回答

7

为什么在开发过程中使用FileInputStream?为什么不从一开始就使用getResourceAsStream?只要你把你的文件放在类路径中的适当位置,你就不会有任何问题。它仍然可以是本地文件系统中的文件,而不是jar文件。

考虑到最终部署环境的发展很有帮助。

编辑:如果你想在目录classpath中的东西,你要么使用:

InputStream x = getClass().getResourceAsStream("/file.txt"); 

InputStream x = getClass().getClassLoader().getResourceAsStream("file.txt"); 

基本上Class.getResourceAsStream将解决相对资源中包含的包班上; ClassLoader.getResourceAsStream解决了与“根”包相关的所有问题。

+0

资源因为它似乎没有如果文件在子目录 – clamp 2009-11-07 21:24:40

+0

这只是建议你这样做是稍有不妥工作。当然,如果你请求正确的资源,它可以在子目录中工作得很好。请给出一个详细的例子,我们可以帮助你。 – 2009-11-07 21:28:48

+0

谢谢,我编辑了我的主帖。 – clamp 2009-11-07 21:34:58

3

您可以始终将资料作为资源读取。您只需将数据所在的路径添加到类路径中即可。

如果你的数据在WEB-INF/somewhere/mydata.txt保持你的jar文件里面,你会访问:

getClass().getResourceAsStream("/WEB-INF/somewhere/mydata.txt") 

现在,如果你创建一个开发目录/devel/WEB-INF/somewhere/mydata.txt并把/devel到类路径中,你的代码将在发展工作生产。在问题的解释后

编辑:

在你的情况this.getClass().getResourceAsStream("mydata.txt")资源是从哪里this类文件取自同一位置拍摄。如果你想保留这个,那么你必须创建一个目录/devel/<path of package>/mydata.txt并再次将/devel添加到你的类路径中。

0

如何通过-D开关在开发环境中设置系统属性?例如java -D:mypropertyname = mypropertyvalue

您可以在开发环境中的ant脚本中设置该属性,但其他环境不会获得属性:

public static boolean isDevEnvironment(){ return System.getProperty("mypropertyname")!=null;} 

你可能会找到一个更好的方式,如果一个文件被认为是已部署的应用程序的一部分,从现有System Properties

0

一个本事(而不是要安装的一部分特定的文件),并可以通过类路径定位,然后考虑简单地始终使用getResourceAsStream,因为它可以工作,而不管实际的部署方案是什么,只要它在类路径中。

您可能还会发现可以从相关的JVM的信息(如果允许由安全管理器):

// Get the location of this class 
    Class cls = this.getClass(); 
    ProtectionDomain pDomain = cls.getProtectionDomain(); 
    CodeSource cSource = pDomain.getCodeSource(); 
    URL loc = cSource.getLocation(); // file:/c:/almanac14/examples/ 

http://www.exampledepot.com/egs/java.lang/ClassOrigin.html?l=rel

0

不应该有VS部署发展之间有什么区别,IHMO。

ClassLoader.getResource方法,或的getResourceAsStream效果很好,你可以阅读资源,甚至写them.You可以编写自己的Protocol handles并访问每件事情都作为URL/URI,它允许您读取和写入资源,同时还能够正确识别谁实际上提供资源。

唯一的问题是如果已经注册了一个URLStreamHandlerFactory(在J2EE应用程序中容器可以安装一个工厂,并且您没有任何方法可以继续并安装自己的工具),并且不能在任何地方使用处理程序。

知道了,最好是实现自己的“资源”。那时候当我需要它的时候我找不到那样的东西,所以我不得不实现我自己的ResourceManager。对我来说,它看起来更直观地访问诸如

Resource layout = ResourceManager.resolve("view://layout/main.jsp") 

,而不是

URL layout = Classloader.getResource("some_package/view/layout/main.jsp")