0

メモリからファイルを提供することを目標に URLStreamHandler を拡張することで、問題を解決しようとしています。私はクラスを持っています...

public class CustomURLStreamHandler extends URLStreamHandler {
    private Handler fileHandler = new Handler();

    @Override
    protected URLConnection openConnection(URL url) throws IOException {
        if (url.toString().contains(".mp4")) {
            return new CustomURLConnection(url);
        }

        return fileHandler.openConnection(url);
    }
}

...これは、MP4 の読み込み方法を変更しようとしています。たとえば、非常に大きなビデオ ファイルがあり、メモリを節約するために、常に X バイトだけをロードしたいとします。CustomURLConnection はここにあります...

public class CustomURLConnection extends URLConnection {
    public CustomURLConnection(URL url) {
        super(url);
    }

    @Override
    public void connect() throws IOException {
        // Nothing needed
    }

    @Override
    public synchronized java.io.InputStream getInputStream() throws IOException {
        return new CustomInputStream(this.url)));
    }
}

...しかし、getInputStream は見た目とは異なることに注意してください。多くの調査の結果、URL 接続の getInputStream は、メディアのコンテンツ タイプを決定するためにのみ使用されているようです。私の場合、最初の 22 バイトのみを調べます。メソッドを変更すると...

@Override
public synchronized java.io.InputStream getInputStream() throws IOException {
    try {
        return new ByteInputStream(new byte[] {}, 0);
    }
}

...ファイルは引き続きロードされます...この入力ストリームはコンテンツ タイプの検出にのみ使用され、失敗した場合、Java は最初に URL と数値を使用する不明なコンテンツ ハンドラを使用してコンテンツ タイプを決定しようとします。すべてアウト。重要な注意点は、メイン メソッドを次のように変更して、CustomURLStreamHandler と CustomURLConnection を使用することです。

public static void main(String[] args) {
    URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory());
    launch(args);
}

...そして CustomURLStreamHandlerFactory では、プロトコルが「ファイル」のときに CustomURLStreamHandler を使用します。パズルの最後のピースは、MP4 MIME のコンテンツ ハンドラーを拡張することのように思えます。

ここに私の問題があります。主な方法を次のように変更しました...

public static void main(String[] args) {
    URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory());
    URLConnection.setContentHandlerFactory(new CustomContentHandlerFactory());
    launch(args);
}

...そして、オーバーライドされたメソッド「createContentHandler」にブレークポイントを配置しましたが、ヒットすることはありません。java.net と sun.net.www URLConnection を使用してこれを試しました (ただし、java.net を使用する方が正しいと 99% 確信しています)。関心のあるコンテンツ ハンドラーに接続できれば、これを機能させることができると確信しています。私のJavaバージョン...

java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

カスタム コンテンツ ハンドラの提供に成功した人はいますか? どんな助けでも大歓迎です、ありがとう。

4

0 に答える 0