【问题标题】:Reading in a text file from a jar in Jython从 Jython 的 jar 中读取文本文件
【发布时间】:2013-12-27 20:01:30
【问题描述】:

我有一个 Jython 代码库和一个 jar 存档中的几个文本文件。我正在使用一个脚本将它们全部打包到一个 jar 文件中以便于分发。我希望能够从 jar 文件中读取文本文件。我试过import语句命令:

fin = java.lang.ClassLoader.getResourceAsStream('jar 内文本文件的路径')

它说 getResourceAsStream 方法需要 2 个参数而不是 1 个参数。我进行了很多搜索,但没有找到使用 Jython 执行此操作的明确方法。谢谢。

【问题讨论】:

    标签: jar jython


    【解决方案1】:

    Jars 只是 zip 文件,因此您可以使用 zipfile 模块。这是我从清单文件中读取版本信息的示例:

    def get_ver(jar_file):
        zf = zipfile.ZipFile(jar_file, 'r')
        try:
            lst = zf.infolist()
            for zi in lst:
                fn = zi.filename
                if fn.lower().endswith('manifest.mf'):
                    try:
                        manifest_txt = str(zf.read(zi.filename), encoding='utf8')
                    except TypeError:
                        manifest_txt = zf.read(zi.filename)
                    lines = manifest_txt.split('\n')
                    for line in lines:
                        if 'Implementation-Version:' in line:
                            return line[23:].strip()
        finally:
            zf.close()
    

    【讨论】:

    • 感谢您的撰写。我知道可以解压缩 jar 文件以读取文件。你知道直接从 jar 中读取文本文件的方法吗?当用纯 java 搜索这个时,似乎有一个 getResourceAsStream 函数可以做到这一点,但我不知道如何在 Jython 中使用它。
    • zipfile.read(),像fin = zf.read('path to the text file inside the jar')一样使用,例如:content = zf.read('META-INF/MANIFEST.MF')。此解决方案适用于所有 Python 解释器,而使用 getResourceAsStream() 的解决方案仅适用于 Jython。但是对于 zipfile,您必须知道 .jar 文件的名称,而 getResourceAsStream() 可能可以从 CLASSPATH 中搜索 jar。
    【解决方案2】:

    您在类上调用getResourceAsStream(),而不是实例。这就是出现错误消息的原因。

    如果您首先创建一个类加载器对象,然后在该对象上使用getResourceAsStream(),它应该可以工作。像这样的:

    from java.lang import ClassLoader
    from java.io import InputStreamReader, BufferedReader
    
    loader = ClassLoader.getSystemClassLoader()
    stream = loader.getResourceAsStream("org/python/version.properties")
    reader = BufferedReader(InputStreamReader(stream))
    
    line = reader.readLine()
    while line is not None:
        print line
        line = reader.readLine()
    

    输出:

    # Jython version information
    jython.version=2.5.3
    jython.major_version=2
    jython.minor_version=5
    jython.micro_version=3
    jython.release_level=15
    jython.release_serial=0
    jython.build.date=Aug 13 2012
    jython.build.time=14:48:36
    jython.build.hg_branch=2.5
    jython.build.hg_tag=
    jython.build.hg_version=c56500f08d34+
    

    输出显示 jython.jar 内的 org/python/version.properties 文件的内容(程序运行时该文件位于类路径中)。 p>

    【讨论】:

    • 工作就像一个魅力。非常感谢!