我在这里解决一个问题。希望从专家那里得到一些帮助。
下面是Java中简单的文件下载器代码。我想在下载文件时检测连接断开的异常。现在,我运行代码,在下载文件的过程中,使用键盘wifi关闭按钮关闭我的wifi。这样做,程序就会永远挂起而不抛出任何异常或终止。它似乎永远阻塞。首先让我困惑的是为什么没有抛出异常?其次,在以下代码中,您可以看到这行//con.setReadTimeout(2000);,目前已被注释掉。去掉注释并运行程序,现在如果通过关闭wifi中断连接,那么它等待2秒钟,然后如果不能读取则终止而不抛出任何异常。所以,同样的情况下,为什么它只终止而不抛出任何异常呢?我对这种行为非常困惑。希望能得到一些帮助。非常感谢!
import java.io.FileOutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.*;
public class Main {
public static void main(String[] args) {
try{
URL website = new URL("http://128f1.downloadming1.com/bollywood%20mp3/Jai%20Ho%20(2014)/06%20-%20Naacho%20Re%20-%20DownloadMing.SE.mp3");
URLConnection con = website.openConnection();
//con.setReadTimeout(2000);
ReadableByteChannel rbc = Channels.newChannel(con.getInputStream());
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...");
}
}
FileChannel
实现(来自fos.getChannel()
)可能会吞掉异常并返回已写入的字节数(如果有)。至于其他情况,我不确定。尝试检查流的类型并查看它们的实现。 - Sotirios Delimanolis