从Jython中的jar读取文本文件

从Jython中的jar读取文本文件,jar,jython,Jar,Jython,我有一个Jython代码库和jar归档中的几个文本文件。我使用一个脚本将它们打包到一个jar文件中,以便于分发。我希望能够从jar文件中读取文本文件。我已使用以下命令尝试导入语句: fin=java.lang.ClassLoader.getResourceAsStream('jar中文本文件的路径') 它说getResourceAsStream方法需要2个参数,而不是1个。我已经搜索了很多,但是没有找到一个使用Jython的清晰方法。谢谢。jar是简单的zip文件,因此您可以使用zipfile模

我有一个Jython代码库和jar归档中的几个文本文件。我使用一个脚本将它们打包到一个jar文件中,以便于分发。我希望能够从jar文件中读取文本文件。我已使用以下命令尝试导入语句:

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


它说getResourceAsStream方法需要2个参数,而不是1个。我已经搜索了很多,但是没有找到一个使用Jython的清晰方法。谢谢。

jar是简单的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只是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()

您正在类而不是实例上调用
getResourceAsStream()
。这就是为什么会出现错误消息

如果您首先创建一个classloader对象,然后在该对象上使用
getResourceAsStream()
,它应该可以工作。大概是这样的:

从java.lang导入类加载器
从java.io导入InputStreamReader,BufferedReader
loader=ClassLoader.getSystemClassLoader()
stream=loader.getResourceAsStream(“org/python/version.properties”)
reader=BufferedReader(InputStreamReader(流))
line=reader.readLine()
虽然行不是无:
打印行
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.jarorg/python/version.properties文件的内容(该文件在程序运行时位于类路径上)。

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

如果您首先创建一个classloader对象,然后在该对象上使用
getResourceAsStream()
,它应该可以工作。大概是这样的:

从java.lang导入类加载器
从java.io导入InputStreamReader,BufferedReader
loader=ClassLoader.getSystemClassLoader()
stream=loader.getResourceAsStream(“org/python/version.properties”)
reader=BufferedReader(InputStreamReader(流))
line=reader.readLine()
虽然行不是无:
打印行
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+

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

感谢您的编写。我知道可以解压jar文件来读取这些文件。您知道一种直接从jar读取文本文件的方法吗?当用纯java搜索时,似乎有一个getResourceAsStream函数可以做到这一点,但我不知道如何在Jython中使用它。有
zipfile.read()
,像
fin=zf.read('jar内文本文件的路径')
,例如:
content=zf.read('META-INF/MANIFEST.MF')
。此解决方案适用于所有Python解释器,而使用
getResourceAsStream()
的解决方案仅适用于Jython。但对于zipfile,您必须知道.jar文件的名称,而
getResourceAsStream()
可能可以从类路径在jar中搜索。感谢您的编写。我知道可以解压jar文件来读取这些文件。您知道一种直接从jar读取文本文件的方法吗?当用纯java搜索时,似乎有一个getResourceAsStream函数可以做到这一点,但我不知道如何在Jython中使用它。有
zipfile.read()
,像
fin=zf.read('jar内文本文件的路径')
,例如:
content=zf.read('META-INF/MANIFEST.MF')
。此解决方案适用于所有Python解释器,而使用
getResourceAsStream()
的解决方案仅适用于Jython。但对于zipfile,您必须知道.jar文件的名称,而
getResourceAsStream()
可能可以从CLASSPATH在jar中搜索。工作起来很有魅力。非常感谢!工作得很有魅力。非常感谢!