【问题标题】:jython reading file from jar filejython 从 jar 文件中读取文件
【发布时间】:2014-05-12 03:08:09
【问题描述】:

我有 jar/zip 文件,其中包含 classes 文件夹下名为accord.properties 的属性文件。

Zip/Jar file:
  +classes
      +accord.properties

我正在读取文件为:

from java.util import Properties
from java.io import File, FileInputStream
def loadPropsFil(propsFil):
    print(propsFil)    
    inStream = FileInputStream(propsFil)
    propFil = Properties()
    propFil.load(inStream) 
    return propFil
pFile = loadPropsFil("/accord.properties")
print(pFile)

在 Tomcat 服务器中运行时,出现错误

Exception stack is: 1. accord.properties (No such file or directory) (java.io.FileNotFoundException) java.io.FileInputStream:-2 (null) 
2. null(org.python.core.PyException) org.python.core.Py:512 (null) 
3. java.io.FileNotFoundException: java.io.FileNotFoundException: accord.properties (No such file or directory) in <script> at line number 34 (javax.script.ScriptException)

尝试过

pFile = loadPropsFil("accord.properties")

pFile = loadPropsFil("classpath:accord.properties")

同样的错误。

编辑

inStream = ClassLoader.getSystemClassLoader().getResourceAsStream("accord.properties")
strProp = Properties().load(inStream) # line 38
options.outputfile=strProp.getProperty("OUTPUT_DIR")

这里 inStream 给出 null 并导致 NullPointer 异常。

错误:

 java.lang.NullPointerException: java.lang.NullPointerException in <script> at line number 38 (javax.script.ScriptException)

【问题讨论】:

    标签: java python jython


    【解决方案1】:

    您不能像使用 FileInputStream 的普通文件一样访问 JAR 中的文件。相反,您需要使用Class.getResourceAsStream() 作为资源 访问它们。试试这样的:

    inStream = ClassLoader.getSystemClassLoader().getResourceAsStream("accord.properties")
    

    很高兴您能够弄清楚如何调用 getResourceStream。我不确定“标记无效”错误是什么意思。这对我来说很好:

        $ CLASSPATH=hello.jar:$CLASSPATH jython
        Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:48:36)
        [Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0
        Type "help", "copyright", "credits" or "license" for more information.
        >>> from java.lang import ClassLoader
        >>> from java.io import InputStreamReader, BufferedReader
        >>> inStream = ClassLoader.getSystemClassLoader().getResourceAsStream("hello.txt")
        >>> reader = BufferedReader(InputStreamReader(inStream))
        >>> reader.readLine()
        u'Hello!'
    

    由于hello.jar 包含文件hello.txt,其中有单行Hello!,以上是我的预期输出。

    【讨论】:

    • @akb - 我没有收到运行代码的错误。如果我使用您发布的属性文件,pFile.getProperty("OUTPUT_DIR") 在我的机器上返回u'/home/mulesoft/report/'。在accord.properties 之前你还没有/ 吗?
    • @akb - 尝试一次删除一行以找出导致问题的原因。您可以尝试切换到 XML 属性文件,看看是否能解决问题。此外,您可以尝试使用Properties 类上的storestoreToXML 方法生成属性文件。
    • 现在我得到 inStream 为空,但我的属性文件存在于 jar 类文件夹下。