Java.net URLConnection.setContentHandlerFactory不';不行?
我试图通过扩展URLStreamHandler来解决一个问题,目的是从内存中提供一个文件。我有课Java.net URLConnection.setContentHandlerFactory不';不行?,java,url,java-8,urlconnection,urlstream,Java,Url,Java 8,Urlconnection,Urlstream,我试图通过扩展URLStreamHandler来解决一个问题,目的是从内存中提供一个文件。我有课 public class CustomURLStreamHandler extends URLStreamHandler { private Handler fileHandler = new Handler(); @Override protected URLConnection openConnection(URL url) throws IOException {
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);
}
}
public static void main(String[] args) {
URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory());
launch(args);
}
public static void main(String[] args) {
URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory());
URLConnection.setContentHandlerFactory(new CustomContentHandlerFactory());
launch(args);
}
…文件仍将加载。。。因为此输入流仅用于检测内容类型,如果失败,Java将尝试使用一个未知的内容处理程序来确定内容类型,该处理程序首先使用URL并计算出所有内容。一个重要的注意事项是,我通过将main方法更改为
@Override
public synchronized java.io.InputStream getInputStream() throws IOException {
try {
return new ByteInputStream(new byte[] {}, 0);
}
}
public static void main(String[] args) {
URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory());
launch(args);
}
public static void main(String[] args) {
URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory());
URLConnection.setContentHandlerFactory(new CustomContentHandlerFactory());
launch(args);
}
…在CustomURLStreamHandlerFactory中,当协议为“文件”时,我使用CustomURLStreamHandler。在我看来,最后一个难题是扩展MP4 MIME的内容处理程序
这就是我的问题所在,我将主要方法改为
@Override
public synchronized java.io.InputStream getInputStream() throws IOException {
try {
return new ByteInputStream(new byte[] {}, 0);
}
}
public static void main(String[] args) {
URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory());
launch(args);
}
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)
是否有人成功地提供了自定义内容处理程序?非常感谢您的帮助。您的问题缺少有关如何实际访问
URL
的信息。最后,是你的(?)应用程序打开了它,如果它检测到URL
有文件
协议,就可以自由地直接访问文件。就我所见,当在URL
上调用openStream()
或getContent()
时,Java不会做这样的事情。但是这些方法也不会试图从InputStream
猜测内容类型,因此了解您在URL
上实际执行的操作会很有帮助……我不是直接创建URL并对其执行操作。我正在JavaFX中创建一个新的媒体对象,并将一个文件URL(作为字符串)传递给它。然后,它在URL连接上调用getInputStream,并最终在ContentHandler上调用getContent。这个方法返回一个对象,我希望提供一个自定义对象,可以按需加载,也可以根据需要加载。我不确定这是否可能,很可能不可能,他们似乎就是这样设计的。是这里的重要键,因为它似乎是JavaFX
的一个属性,可以绕过整个javaurl处理代码。这就是为什么MediaPlayer
不能使用任意URL
协议,而只能使用它知道如何处理自身的协议。这似乎也不是什么问题。