我试图通过扩展 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 进行了尝试(尽管我 99% 确信 java.net 是正确的)。我很确定,如果我能连接到我关心的内容处理程序,我就能让它工作。我的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)
有没有人成功提供自定义内容处理程序?非常感谢任何帮助,谢谢。