0

私はcommons-vfsを使用しており、テストには RAM ファイル システムを使用したいと考えています。試してみるとnew URL("ram:///A/B/sample.jar")、次の例外が発生します。

java.net.MalformedURLException: unknown protocol: ram
    at java.net.URL.<init>(URL.java:592)
    at java.net.URL.<init>(URL.java:482)
    at java.net.URL.<init>(URL.java:431)

ここにいくつかのコードがあります(ファイルプロトコルを使用するとすべて正常に動作します)

// URL is used to construct an object
obj.addArchive(new URL("ram:///A/B/sample.jar"))    
...
// then VFS is used to scan the object urls
// for instance get the parent directory
FileSystemManager manager = VFS.getManager();
String directory = manager.resolveFile(obj.getPath()).getParent().getURL().toExternalForm();

ramでプロトコルを使用するにはどうすればよいjava.net.URLですか?

4

2 に答える 2

0

VFS は、登録されたすべてのスキームを認識しているストリーム ハンドラ ファクトリの作成をサポートしています。

// you might want to configure a manager with less schemes
FileSystemManager fsm = VFS.getManager(); 
URLStreamHandlerFactory factory = fsm.getURLStreamHandlerFactory();
URL.setURLStreamHandlerFactory(factory); // VM global
URL url = new URL("ram://test.txt");
于 2015-01-05T16:50:39.280 に答える
0

here でURL説明されているように、カスタム ハンドラーの使用に基づく解決策を見つけました。

url-scheme-registryに Maven 依存関係を追加します。

<dependency>
    <groupId>org.skife.url</groupId>
    <artifactId>url-scheme-registry</artifactId>
    <version>0.0.1</version>
</dependency>

ramスキーマのカスタムURLStreamHandlerを作成します。

public class RamHandler extends URLStreamHandler { 
  @Override
  protected URLConnection openConnection(final URL u) throws IOException {
    //May instead use VFS DefaultURLConnection
    return new URLConnection(u) {
      @Override
      public void connect() throws IOException {}

      @Override
      public InputStream getInputStream() throws IOException {
        FileSystemManager fsManager = VFS.getManager();
        FileObject entry = fsManager.resolveFile(u.toExternalForm());
        FileContent content = entry.getContent();
        return content.getInputStream();
      }
    };
  }
}

次に、不正な URL の例外はありません。

UrlSchemeRegistry.register("ram", RamHandler.class);
URL url = new URL("ram:///A/B/sample.jar");
于 2014-12-19T11:08:46.987 に答える