Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java.net URLConnection.setContentHandlerFactory不';不行?_Java_Url_Java 8_Urlconnection_Urlstream - Fatal编程技术网

Java.net URLConnection.setContentHandlerFactory不';不行?

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 {

我试图通过扩展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);
    }
}
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
协议,而只能使用它知道如何处理自身的协议。这似乎也不是什么问题。