在java中下载文件时如何检测网络断开连接?

我使用以下代码使用Java下载文件,但我想检测何时连接丢失。 我运行了下面的代码,而在下载过程中,我故意断开了我的互联网,但没有抛出任何exception而且它被绞死了。 即使在打开连接后,也没有发生任何事情。 所以,它在没有任何例外的情况下永远挂起。 有没有办法让它在连接丢失时抛出exception? 谢谢您的帮助!

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 : //technfun.wordpress.com/2009/01/29/networking-in-java-non-blocking-nio-blocking-nio -and-IO /

你当前的线程永远阻止 – 这就是你的根本问题。 因此,一种可能的解决方案是切换到异步操作和/或设置超时

由于您使用的是HTTP,因此最好使用Apache HttpClient项目。 org.apache.http.client.config.RequestConfig.Builder允许设置java.net.URL和相关类中没有对应关系的各种超时值。 特别是设置套接字超时对您的情况有帮助。 然后,您可以使用org.apache.http.HttpEntity.writeTo直接将资源写入FileOutputStream。