首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问IKVM移植的java库的.net资源?

如何访问IKVM移植的java库的.net资源?
EN

Stack Overflow用户
提问于 2012-11-06 01:46:31
回答 2查看 1.3K关注 0票数 6

我正在使用IKVM将一些java库移植到我的c#项目中。库api (StanfordNLP)要求加载一个文件来训练nlp函数使用的统计模型。从文件系统加载文件已经很好地工作了几周,但现在我想将文件作为嵌入式资源添加到dll中,而不是从文件系统中检索它。

问题是java api找不到.net嵌入式资源。

以下是从文件系统检索文件时工作的代码片段:

代码语言:javascript
复制
public class SNLPModel
{
   public LexicalizedParser LP;

   public SNLPModel()
   {
      // Using a relative file path in the target build directory
      LP = LexicalizedParser.loadModel("models-stanford\\englishPCFG.ser.gz");
   }
}

但当我(使用VS2012)在visual studio中将"englishPCFG.ser.gz“文件设置为嵌入式资源,并更改代码以匹配:

代码语言:javascript
复制
public class SNLPModel
{
   public LexicalizedParser LP;

   public SNLPModel()
   {
        // Using this line of code to verify that the file is being loaded as
        // an embedded resource. Running in debug, I have verified that it is, and
        // noted its complete name.
        string[] s = System.Reflection.Assembly.GetExecutingAssembly()
                        .GetManifestResourceNames();

        java.io.InputStream modelFile = java.lang.ClassLoader
              .getSystemResourceAsStream
              ("FeatureExtraction.StanfordNLP_Models.englishPCFG.ser.gz");

        java.io.ObjectInputStream x = new java.io.ObjectInputStream(modelFile);

        LP = LexicalizedParser.loadModel(x);
   }
}

InputStream对象modelFile总是返回null。我尝试了各种形式的资源字符串,替换了前两个点(".")使用正斜杠("/")、反斜杠("\")和双反斜杠("\")。我开始怀疑java.io无法访问.net资源。java api不能识别.net资源并不奇怪,但我认为IKVM可能会提供一座桥梁。我看到了一个名为IKVM.Internals.VirtualFileSystem的引用,但只有一个引用(http://old.nabble.com/Manual-by-name-embedded-resource-lookup--td31162421.html),并且没有找到任何实际包含该类的IKVM。

任何帮助都将不胜感激。我正在使用:

c#.NET 4.5

Visual Studio 2012

斯坦福最新的NLP java库

IKVM 7.0.4335.0

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-06 15:35:50

在IKVM中没有对此的自动支持,但您可以很容易地自己完成此操作:

代码语言:javascript
复制
var asm = Assembly.GetExecutingAssembly();
var stream = asm.GetManifestResourceStream("FeatureExtraction.StanfordNLP_Models.englishPCFG.ser.gz");
var inp = new ikvm.io.InputStreamWrapper(stream);
var x = new java.io.ObjectInputStream(inp);
票数 4
EN

Stack Overflow用户

发布于 2017-05-19 11:41:01

正确解决方案的提示在于您嵌入的文件的扩展名。

如果它是纯序列化的java对象(如english-left3words-distsim.tagger),则可以像这样加载它

代码语言:javascript
复制
let model = "../english-left3words-distsim.tagger"
use fs = new FileStream(model, FileMode.Open)
use isw = new ikvm.io.InputStreamWrapper(fs)
let tagger = edu.stanford.nlp.tagger.maxent.MaxentTagger(isw)

但是如果您模型具有扩展.gz,这意味着文件是this格式的,在反序列化之前,您必须将输入流包装到java.util.zip.GZIPInputStream

代码语言:javascript
复制
let model = "../englishRNN.ser.gz"
use fs = new FileStream(model, FileMode.Open)
use isw = new ikvm.io.InputStreamWrapper(fs)

use ois =
    if model.EndsWith(".gz")
    then
        let gzs = new java.util.zip.GZIPInputStream(isw)
        new java.io.ObjectInputStream(gzs)
    else new java.io.ObjectInputStream(isw)
let lp = edu.stanford.nlp.parser.lexparser.LexicalizedParser.loadModel(ois)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13237505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档