下载java文件时如何检测网络断开?

下载java文件时如何检测网络断开?,java,download,Java,Download,我正在使用以下代码使用Java下载一个文件,但我想检测连接何时丢失。我运行下面的代码,而在下载的中间,我故意断开我的互联网,但没有异常被抛出,并挂起。即使在重新打开连接后,也没有发生任何事情。因此,它无一例外地永远被吊死。有没有办法让它在连接丢失时抛出异常?谢谢你的帮助 package toplower.top; import java.io.FileOutputStream; import java.net.URL; import java.nio.channels.Channels; im

我正在使用以下代码使用Java下载一个文件,但我想检测连接何时丢失。我运行下面的代码,而在下载的中间,我故意断开我的互联网,但没有异常被抛出,并挂起。即使在重新打开连接后,也没有发生任何事情。因此,它无一例外地永远被吊死。有没有办法让它在连接丢失时抛出异常?谢谢你的帮助

package toplower.top;

import java.io.FileOutputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.*;

import javax.mail.*;

    public class testing {
        public static void main(String[] args) {

            try{

                URL website = new URL("http://b128.ve.vc/b/data/128/1735/asd.mp3");
                ReadableByteChannel rbc = Channels.newChannel(website.openStream());
                FileOutputStream fos = new FileOutputStream("song.mp3");

                fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);


            }
            catch(Exception e){

                System.out.println("got here");
                e.printStackTrace();
            }



            System.out.println("Done downloading...");


        }
    }

显然,您可以在套接字上设置超时,我认为本文描述了它:


您当前的线程永远阻塞—这是您的根本问题。因此,一种可能的解决方案是切换到异步操作和/或设置超时,因为您使用的是HTTP,所以最好使用该项目。org.apache.http.client.config.RequestConfig.Builder允许设置在java.net.URL和相关类中没有对应关系的各种超时值。特别是设置套接字超时将有助于您的情况。然后,您可以使用org.apache.http.HttpEntity.writeTo直接将资源写入FileOutputStream。

您等待异常多长时间?因为它应该被抛出,但是由于你物理上断开了连接,你的操作系统需要等到套接字超时后才能发出中断信号。。。这可能需要几秒钟,甚至可能是30秒,我明白了…让我试试。我等了5分钟,但仍然没有抛出异常。它似乎永远被封锁了。您认为超时时间可能超过5分钟吗?为什么不在代码中明确指定超时,它肯定会工作@用户3256520。不太可能。如果您的场景在合理的时间内没有产生异常。。。好要么是您的代码有缺陷,要么是您使用的库java.nio存在缺陷。我想我们还是前一种可能性吧。请发布您的实际代码-全部。好的,我没有明确使用套接字,所以我假设下面的URL使用它…所以除了完全更改代码并使用套接字之外,没有其他方法可以绕过此代码吗?请在您的计算机中运行代码,并让我知道您是否也没有收到异常?我试图怀疑问题是否出在我的硬件上。我正在使用一台非常旧的计算机。您可以使用它通过URL/HTTP创建基于套接字的连接:好的,我稍微更改了代码,所以现在URL连接有一个超时。URL网站=新的URL;URLConnection con=website.openConnection;con.setReadTimeout1000;ReadableByteChannel rbc=Channels.newChannelcon.getInputStream;FileOutputStream fos=新的FileOutputStreamsong.mp3;fos.getChannel.transferFromrbc,0,Long.MAX_值;但另一件奇怪的事情是它正确超时,但不抛出异常。文档说当超时被触发时会引发异常。所以,现在我真的怀疑我的硬件。