锁定老帖子 主题:仿佛兮若轻云之蔽月,飘飘兮若流风之回雪
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-12
最后修改:2011-03-13
仿佛兮若轻云之蔽月,飘飘兮若流风之回雪。一种名状,是一种墨迹,一种发自潜意识的。 请问:大家懂我说的这句话的意思吗?程序员的生活要种诗意,偶尔写写小散文,为什么程序员不能成为诗人呢? 只需要一种名状和意境,平凡的人也可以超神,难道数字和键码是我们全部吗?一个小小的意境,一个小小灵感来之不易,为何不赶快铭刻在心呢?不,刻于心。就像初恋一样,苦涩的味道,一种清甜,远了,但香味依然残留在十指之间。她是如此迷人,深呼一口气品尝她的味道,只有甜味吗?不,一种难咽但难割舍的味道,什么味道都有,怪味豆。不要相信你就是哪个天天吃着天香蚕豆的绝世天人,非也,大神不是你。大神神吗?神,但也不神,有人说我当你是空气,你一定很气,特别是你的小初恋情人说出的,我们需要的是一种心态。为何我就不是那空气。如果我是空气就是大神了。知道什么是大神。不做解释,老年纪了就问问朋友。大神是种名状,已融掉了。但是确实很牛B,但又是那么平凡你天天感受的到他的存在的。空气知道了吗?不知道你就非人类。但是这个世界我是没见过的,不知道那么大神见过。每每呼吸一口空气,我就听的到自己的心跳在还在跳,大神就是能带你给你心跳的人。你吸入他,他融入了你那么你牛了,功底不错。如果你没能融入他,那么他也不伤害你,只是你可能哮喘了,瓶颈了。”这么“办。千万在别在来个小高血压,那么你的小命不保,人生到头了。呼出了他,是二氧化碳了,废气吗?no(弄:no的意思),还可以光合作用。他是如此的好,人人爱,想爱都不行,除非你想少活几年。死到不会,拿空气来第一人称。简述完毕:大神概念。是丰功伟业吗?弄:平凡的无处不在,但你天天感受的到,缺他不可,就这么缺他不可,是多少人的梦,不是:是在睡觉时的那种不名状的笑。 1,2,3,4....哒地,哒等哒,哒地哒等哒,妹妹我一定要得到你,你就是我今生的唯一,只要我还能继续呼吸,我就,我就,不会轻易的放弃你。 本来是写给一个女孩的,但是又和工作联系上了,没发成,就发这里,本想用优美的文字来表达,听着音乐双手就像弹钢琴一样,十指休闲的在那块富有弹性的方格区,跳起了优美的华尔兹。由于华尔兹很优美,没加入幽默的街舞味道,请原谅,我不能破坏了这优美的舞姿。 专业的事用大神的心态对待,用高度兴趣的态度完成专业的事情。(职业的游戏竞技手,专业吧,还是权威的,在专业上吗?在兴趣上,游戏是娱乐,但是真要你成为职业手,你未必很快乐,也许就是痛苦。游戏好玩,但不要被游戏玩了。) 那天失去了兴趣怎么,苦脑,郁闷,做为男人有什么苦脑的,pass。郁闷,男人,女人都有的。弄:什么男人和女人都的,郁(欲:想要的意思),(闷:man:男人的意思)。大家跟我一起连起来说一遍:想要男人。作为男人的我们:怎么能郁闷,郁闷,郁闷,郁闷那不是女人干的事吗,我们什么时候说郁闷了。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
扯谈太多,懒得对源码的解释,请原谅!!!共享下。。。。 package org.crazyit.flashget.thread; import java.io.File; import java.io.RandomAccessFile; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import org.crazyit.flashget.ContextHolder; import org.crazyit.flashget.DownloadContext; import org.crazyit.flashget.object.Part; import org.crazyit.flashget.object.Resource; import org.crazyit.flashget.state.Finished; public class DownloadHandler { public static Map<String, Timer> timers = new HashMap<String, Timer>(); public void stopTimer(Resource r) { Timer t = timers.get(r.getId()); if (t != null) { t.cancel(); } } public void doDownload(Resource r) { try { //设置下载日期 if (r.getDownloadDate() == null) r.setDownloadDate(new Date()); r.setState(DownloadContext.CONNECTION); //计算出每一块的大小 int partLength = r.getSize() / r.getThreadSize() + 1; //时间计算任务 CountTimeTask timeTask = new CountTimeTask(r); Timer timer = new Timer(); timer.schedule(timeTask, 0, 1000); //将Timer对象放到Map中, key为该资源的id timers.put(r.getId(), timer); for (int i = 0; i < r.getThreadSize(); i++) { int length = partLength; //如果是最后一块, 则使用总数来减去前面块的总和 if (i == (r.getThreadSize() - 1)) { length = r.getSize() - i * partLength; } //创建各个Part对象 Part p = new Part((i * partLength), length, 0); r.getParts().add(p); RandomAccessFile rav = new RandomAccessFile(r.getFilePath() + File.separator + p.getPartName(), "rw"); DownloadThread t = new DownloadThread(r, rav, p); //设置线程优先级 t.setPriority(6); t.start(); } } catch (Exception e) { r.setState(DownloadContext.FAILED); e.printStackTrace(); } } public void resumeDownload(Resource r) { if (r.getState() instanceof Finished) return; try { CountTimeTask timeTask = new CountTimeTask(r); Timer timer = new Timer(); timer.schedule(timeTask, 0, 1000); //将Timer对象放到Map中, key为该资源的id timers.put(r.getId(), timer); for (int i = 0; i < r.getParts().size(); i++) { Part p = r.getParts().get(i); RandomAccessFile rav = new RandomAccessFile(r.getFilePath() + File.separator + p.getPartName(), "rw"); DownloadThread t = new DownloadThread(r, rav, p); t.start(); } } catch (Exception e) { r.setState(DownloadContext.FAILED); e.printStackTrace(); } } //计算时间任务 class CountTimeTask extends TimerTask { private Resource r; public CountTimeTask(Resource r) { this.r = r; } public void run() { r.setCostTime(r.getCostTime() + 1); } } }
============================================================================
package org.crazyit.flashget.thread; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Timer; import java.util.TimerTask; import org.crazyit.flashget.ContextHolder; import org.crazyit.flashget.DownloadContext; import org.crazyit.flashget.exception.URLException; import org.crazyit.flashget.object.Part; import org.crazyit.flashget.object.Resource; import org.crazyit.flashget.state.Pause; import org.crazyit.flashget.util.FileUtil; public class DownloadThread extends Thread { private URL url; private RandomAccessFile raf; //下载的资源对象 private Resource resource; //本线程需要下载的块 private Part part; /** * 下载线程构造器 */ public DownloadThread(Resource resource, RandomAccessFile raf, Part part) { this.url = createURL(resource.getUrl()); this.raf = raf; this.part = part; this.resource = resource; } private URL createURL(String urlPath) { try { return new URL(urlPath); } catch (Exception e) { throw new URLException("create url error"); } } public final static int MAX_BUFFER_SIZE = 1024; public void run() { try { //计算开始点与结束点 int begin = part.getBegin() + part.getCurrentLength(); int end = part.getBegin() + part.getLength() - 1; //如果是开始点大于结束点, 证明该块已经下载完成 if (begin >= end) { this.raf.close(); return; } HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); urlConnection.setRequestProperty("Range", "bytes=" + begin + "-" + end); //如果连接不上相应的地址, 抛出java.net.UnknownHostException urlConnection.connect(); //如果找不到相应的资源, 将抛出java.io.FileNotFoundException InputStream is = urlConnection.getInputStream(); byte[] buffer = new byte[MAX_BUFFER_SIZE]; int perRead = 0; //设置状态为下载 this.resource.setState(DownloadContext.DOWNLOADING); //在.part文件中设置当前所读取的指针 this.raf.seek(this.part.getCurrentLength()); while ((perRead = is.read(buffer)) != -1) { //判断资源对象的状态是否被修改成暂停 if (this.resource.getState() instanceof Pause) { closeStream(is, urlConnection, this.raf); return; } //判断资源对象状态 raf.write(buffer, 0, perRead); this.part.setCurrentLength(this.part.getCurrentLength() + perRead); } closeStream(is, urlConnection, this.raf); //判断是否下载完成, 如果下载完成, 则进行合并文件 //注意这里需要得到整个文件的大小, 而不是某个.part文件的大小 if (isFinished(this.resource.getSize())) uniteParts(); } catch (Exception e) { this.resource.setState(DownloadContext.FAILED); e.printStackTrace(); } } private void closeStream(InputStream is, HttpURLConnection urlConnection, RandomAccessFile raf) throws IOException { is.close(); urlConnection.disconnect(); raf.close(); } /** * 判断是否下载完成, 遍历下载文件的各个.part文件 * @param fileLength * @return */ private boolean isFinished(int fileLength) { List<Part> parts = this.resource.getParts(); //计算已下载的总数 int downCount = 0; for (Part part : parts) downCount += part.getCurrentLength(); return (downCount >= fileLength) ? true : false; } /** * 合并part文件 */ private void uniteParts() throws IOException { List<Part> parts = this.resource.getParts(); //创建文件输出流, 输出到下载文件 OutputStream bos = new FileOutputStream(this.resource.getSaveFile(), false); for (Part part : parts) { //得到.part文件 File partFile = new File(FileUtil.getPartFilePath(this.resource, part)); //获得文件输入流 InputStream is = new FileInputStream(partFile); byte[] buffer = new byte[1024]; int bytesRead; int temp = 0; while ((bytesRead = is.read(buffer)) != -1) { temp += bytesRead; //写到文件中 bos.write(buffer, 0, bytesRead); } is.close(); } bos.close(); this.resource.setState(DownloadContext.FINISHED); } public static void main(String[] args) throws Exception { int threadSize = 5; Resource f = new Resource("http://www.apache.org/dist/struts/library/struts-2.1.8.1-lib.zip", "C:/test-download", "struts.zip", threadSize); ContextHolder.dh.doDownload(f); } }
Sorry!上次忘给源码了。 写道
希望对你们有些个帮。。。。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-03-12
看来楼主之前是一直在潜水,给你顶顶
|
|
返回顶楼 | |
发表时间:2011-03-14
三国杀玩多了
|
|
返回顶楼 | |
发表时间:2011-03-18
gougou851129 写道 三国杀玩多了
哈哈,真j洛神啊 |
|
返回顶楼 | |
发表时间:2011-03-19
1、楼主三国杀玩多了 而且还是甄宓控
2、楼主的探讨精神很好 3、程序员最高境界在于享受代码之美 4、回来再好好研究 不过迅雷比这个好像还复杂一点。 |
|
返回顶楼 | |
发表时间:2011-06-17
最后修改:2011-06-17
这位兄弟,看了你写的散文,感觉你的思维比较乱,让人跟不上,一会天上一会地下一会又云间。
|
|
返回顶楼 | |
发表时间:2011-06-17
顺便把断点续传也加上
|
|
返回顶楼 | |
浏览 4144 次