.Net中的WordNet数据库目录相对路径

问题描述 投票:2回答:1

要使用JAWS,需要在应用程序中指定WordNet数据库目录,如下所述:http://lyle.smu.edu/~tspell/jaws/

System.setProperty("wordnet.database.dir", "resources/WordNet-3.0/dict/");

这在IDE中运行良好。但是没有编译成.jar文件。因此,需要.jar文件中WordNet目录的相对路径。尝试了各种方法。最后是:

String url = this.getClass().getClassLoader()
            .getResource("resources/WordNet-3.0/dict/index.sense").toExternalForm();
url = url.substring(0, url.length() - 12);

从.jar文件中测试结果:

罐子:文件:/ C:/file/path/jar.jar /resources/WordNet-3.0/dict/

认为这将是解决方案,但仍然在运行.jar时找不到目录或者更确切地说是index.sense。 index.sense应该通过以下方式加载:

WordNetDatabase database = WordNetDatabase.getFileInstance();

这使用了指定的目录。找到了几个线程,但没有任何建议。例如:

How to get the path of a running JAR file? How to get a path to a resource in a Java JAR file Loading a file relative to the executing jar file

java jar path jaws-wordnet
1个回答
2
投票

您无法进入JAR文件,WordNet API没有使用虚拟文件系统。因此,它无法在您尝试生成的资源URL中查找。 WordNet API使用包含在File中的FileReaderBufferedReader,其中没有一个可以打开文件名,例如file:///some/dir/to/file.jar!something/in/a/jar

您可以做的是让程序首先使用上面的方法找到正确的JAR,以便在某个jar XYZ中查找资源,然后将XYZ JAR文件的相关内容解压缩到临时缓存目录中,然后指向WordNet wordnet.database.dir该缓存目录中的系统属性。

根据您使用的JDK版本,取决于从Java中解压缩JAR的最佳方法,但有很多例子可以帮助您。

替代方法是修改您正在使用的代码(JAWS库)以从流而不是文件加载资源(如果您提供classpath:relative/path/in/jars格式的wordnet.database.dir属性)。否则,您会将其视为文件。只需查找该库中所有出现的文件读取,并使用常用的实用程序函数替换该流的创建,该函数返回包装正确类型的输入流的BufferedReader

© www.soinside.com 2019 - 2024. All rights reserved.