如何访问OSGi捆绑包中的文件?

| 我是OSGi的新手,并创建了一个OSGi捆绑包,该捆绑包在Apache Felix OSGi容器中运行。 捆绑软件中包含一个文件资源,我需要将其作为“ 0”传递给方法。要实例化文件对象,必须使用\“ file \”-方案中的URI或字符串形式的路径。如何以干净的方式检索其中的任何一个? 我尝试使用
context.getBundle().getResource(\"/myfile\")
(上下文为
org.osgi.framework.BundleContext
类型),它返回URI
bundle://6.0:0/myfile
。 但是此URI不能使用the4ѭ构造函数转换为File-instance,因为它具有\“ bundle \”-方案。 可以尝试构造一条到该位置的路径,从而知道工作目录并利用我的bundle的bundleId,但是我怀疑这是最佳实践。 有任何想法吗?     
已邀请:
        由于文件位于文件包中,因此无法使用标准的“ 5”来获取文件。从“ 7”获得的“ 6”是获取这些资源的正确方法,因为OSGi API还旨在在没有实际文件系统的系统上工作。我将始终尝试坚持使用OSGi API,而不是使用特定于框架的解决方案。 因此,如果您对方法有控制权,我将对其进行更新,使之花费6英镑,甚至9英镑(因为您可能只想读取它)。为方便起见,您总是可以提供一个辅助方法,花费does5。 如果您无法控制该方法,则必须编写一些辅助方法,该方法需要
URL
,并将其流式传输到文件中(例如,
File.createTempFile()
可能会解决问题)。     
        也许该API令人困惑,但是您可以通过以下方式访问OSGI捆绑包中的文件:
URL url = context.getBundle().getResource(\"com/my/weager/impl/test.txt\");

// The url maybe like this: bundle://2.0:2/com/my/weager/impl/test.txt
// But this url is not a real file path :(, you could\'t use it as a file.
// This url should be handled by the specific URLHandlersBundleStreamHandler, 
// you can look up details in BundleRevisionImpl.createURL(int port, String path)
System.out.println(url.toString());

BufferedReader br =new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
while(br.ready()){
    System.out.println(br.readLine());
}
br.close();
getResource
会像OSGI类加载器理论一样,通过整个OSGI容器找到资源。
getEntry
将从本地捆绑包中找到资源。并且返回网址可以转换为file,但可以转换为inputStream。 这是一个与此相同的问题:无法访问捆绑资源/文件(OSGi) 希望这对您有所帮助。     
        我使用的是getClassLoader()。getResourceAsStream():
InputStream inStream = new java.io.BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream(fileName));
这样,文件将从您的资源目录中加载。 FileName应该包含\“ src / main / resources \”之后的路径。 完整示例如下:
static public byte[] readFileAsBytes(Class c, String fileName) throws IOException {
    InputStream inStream = new java.io.BufferedInputStream(c.getClassLoader().getResourceAsStream(fileName));
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int nbytes = 0;
    byte[] buffer = new byte[100000];

    try {
        while ((nbytes = inStream.read(buffer)) != -1) {
            out.write(buffer, 0, nbytes);
        }
        return out.toByteArray();
    } finally {
        if (inStream != null) { 
            inStream.close();
        }
        if (out != null) {
            out.close();
        }
    }
}
    

要回复问题请先登录注册