我试图通过扩展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并将所有内容都列出来。一个重要的注意事项是我通过将main方法更改为...来使用CustomURLStreamHandler和CustomURLConnection ...
public static void main(String[] args) {
URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory());
launch(args);
}
...并且在CustomURLStreamHandlerFactory中,当协议是" file"时,我使用我的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)
有没有人成功提供自定义内容处理程序?非常感谢任何帮助,谢谢。