- 今天再写多线程断点下载时,因为要模拟终端下载的行为,在程序中使用了system.exit(0)函数,一开始程序很正常,后来偶然一次调试程序时,发现某个线程已经完成下载了,但该线程的数据却没有被删除,很奇怪,理论上讲finally块中的程序无论程序正常或异常都会去执行,经过查阅文档,发现该函数的功能是结束JVM,恍然大悟,JVM都已经结束了,怎么可能还会去执行程序呢?!
- 关于inputStram.available()的小事,还是在今天写多线程断点下载时遇到的,很奇怪,我是用该方法给byte数组赋长度,但是很奇怪的是,线程下载的字节一直是0,然后看了一下inputStream.read(bs)方法的说明,说是字节数组bs的长度为0时,会返回0,当时很纳闷,难道输出流就没有任何字节吗?然后我终端线程下载,再开启时,发现该线程又能下载了,很奇怪,经过查阅,发现了关于available()方法的一些有趣的事:此方法只能适用于本地文件的读取,但是用于网络通讯、下载时,
由于服务器发送数据是间断性的,一串字节往往分几批发送,
本地程序调用available()方法有时会得到0,这可能是对方还没有响应,
也可能是对方响应了,但是数据还没有送达本地。例如对方发送了1000个
字节给你,也许分3批到达,这你就要用调用3次available()方法才能将数据总数全部得到。更特别的是inputStram.available()的返回值总是0,也就是说该方法的实现是靠子类重写的,fileinputstream.available()方法是通过文件描述符获取文件的总大小,而并不是事先将磁盘上的文件数据全部读入流中,再获取文件总大小。