Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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-HttpUrlConnection正在等待下载完成_Java_Http_Youtube - Fatal编程技术网

Java-HttpUrlConnection正在等待下载完成

Java-HttpUrlConnection正在等待下载完成,java,http,youtube,Java,Http,Youtube,我正试图使用youtubeinmp3 api下载youtube视频,但问题是,当我试图转换一首尚未在其库中的歌曲时(意味着之前未转换过),该网站将开始将该歌曲转换为.mp3格式 现在,我的HTTPUrlConnection发生的事情是,如果下载链接已经在站点上,因为它已经被缓存,那么它可以完美地运行,但是如果站点必须执行转换,它就可以在不等待转换的情况下运行——这意味着我只会得到一个错误 这就是我目前拥有的: URL link = new URL("http://YouTubeI

我正试图使用youtubeinmp3 api下载youtube视频,但问题是,当我试图转换一首尚未在其库中的歌曲时(意味着之前未转换过),该网站将开始将该歌曲转换为.mp3格式

现在,我的HTTPUrlConnection发生的事情是,如果下载链接已经在站点上,因为它已经被缓存,那么它可以完美地运行,但是如果站点必须执行转换,它就可以在不等待转换的情况下运行——这意味着我只会得到一个错误

这就是我目前拥有的:

        URL link = new URL("http://YouTubeInMP3.com/fetch/?video=http://www.youtube.com/watch?v=JbjtL7P9eI0&autostart=1");

        InputStream in = new BufferedInputStream(link.openStream());
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int n = 0;
        HttpURLConnection httpConnection = (HttpURLConnection) (new URL("http://YouTubeInMP3.com/fetch/?video=http://www.youtube.com/watch?v=JbjtL7P9eI0&autostart=1").openConnection());
        System.out.println(HttpURLConnection.HTTP_OK);
        long completeFileSize = httpConnection.getContentLength();
        long downloadedFileSize = 0;
        //int currentProgress = 0;
        while (-1!=(n=in.read(buf)))
        {
            out.write(buf, 0, n);
            downloadedFileSize += n;
            final int currentProgress= (int) (downloadedFileSize * 100 / completeFileSize);
            System.out.println("current progress: "+currentProgress);

        }
        System.out.println("Finished");
        out.close();
        in.close();
        byte[] response = out.toByteArray();

        FileOutputStream fos = new FileOutputStream("/Users/stephen/Desktop/test.mp3");
        fos.write(response);
        fos.close();

我想的是找到一种方法来停止我的程序的执行,或者让它在一个while循环中运行,只要网站还没有完成加载。有什么方法可以做到这一点吗?

您将连接打开两次,一次用于获取流,一次用于内容长度。如果你必须这样做,你应该接受-1作为正确的值,意思是:还不知道

Im这种情况下,只需跳过shpwing进度百分比并进行下载,直到完成


我建议只使用一个HttpUrlConnection,而不是两个

打开连接两次——一次用于获取流,一次用于内容长度。如果你必须这样做,你应该接受-1作为正确的值,意思是:还不知道

Im这种情况下,只需跳过shpwing进度百分比并进行下载,直到完成


我建议仅使用1个HttpUrlConnection-而不是两个

共享此错误。如果我选中了
completeFileSize
,它将返回
-1
如果必须转换文件,请共享此错误。如果我选中
completeFileSize
,则输出文件将为空,如果必须转换文件,它将返回
-1
,这应该不是一个太大的问题,无法修复,但我的问题主要是因为当我打开连接时,网站没有读取下载链接,所以我的程序无法获取视频。所以循环20次,而-1==getContebtLength和sleep 5s处于循环中?这应该不是一个太大的问题,需要解决,但我的问题主要是,因为当我打开连接时,网站没有读取下载链接,所以我的程序无法获得视频。所以循环20次,而-1==getContentBTLength,并在循环中休眠5秒?