`
isy
  • 浏览: 101478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

java写的电驴下载完成关机小程序

    博客分类:
  • java
阅读更多
经常用到电驴下载资料,一些http你根本找不到的资源,当然速度是不能恭维了,驴子么,干的就是慢活,热门资源除外…

我用的verycd版的电驴,原版电驴的一种mods,电驴貌似有N多版本,不过我觉得verycd的就够用了,毕竟国内八成的人都在用.

最近在下新东方的新概念英语教程,进度87%,眼看要下完了,等要等1个多小时,下载完成又不自动关机,很是苦恼,虽然verycd一直提倡共享互联网,下载完成关机也是违背了电驴的分享精神,可国家还一直提倡节能减排呢,机箱嗡嗡响也耽误我的睡眠质量…再三矛盾之下,还是决定写一个小程序备用.我开机的时候接着分享就是了.

刚开始搜了一下网上的自动关机程序,真是天下文章一大抄,看的最多的版本就是检测根目录下的temp文件夹,用vbs脚本编写,还有其他的版本,反正是没找到可以用的,自己翻了翻temp文件夹,发现里面什么都没有….这文章也够陈旧的了,自己研究下verycd下载套路,发现一个downloads.txt文件同步正在下载的资源信息,下载完成后自动删除里面的记录,这就简单多了.

思路:读downloads.txt文件,利用关键字把里面的记录分割后加入list,选择监视的文件名,利用while循环的倒计时方法以文件名为关键字从list里定时搜索,如果下载完成,调用runtime类运行dos命令shutdown,执行关机.代码如下:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Scanner; 

/** 
* @author Y 2010/04/01 23:39 
*/ 
public class ShutDown { 
// easyMule下downloads.txt文件的路径 
public static final String FILEPATH = “D:\\Program Files\\easyMule\\downloads.txt”; 

// 查找下载记录数的关键字 
public static final String KEYWORD = “ed2k://|file|”; 

// 刷新读入downloads.txt的时间(秒) 
int second = 5; 

// 下载完成后关机的延迟时间(秒) 
int times = 60; 

// 需要监视的文件id号 
int id; 

// 监视的文件名称 
String fileName; 

public ShutDown() { 
  System.out.println(“当前的下载文件信息为:”); 
  System.out 
    .println(“————————————————————–”); 
  showFile(readText(FILEPATH, KEYWORD)); 
  System.out 
    .println(“————————————————————–”); 
  System.out.println(“要等哪个文件下载完成关闭计算机?”); 
  Scanner scan = new Scanner(System.in); 
  id = scan.nextInt() – 1; 
  fileName = (String) readText(FILEPATH, KEYWORD).get(id); 
  System.out.println(“监视的文件是:” + fileName); 
  while (countDown(second)) { 

   if (readText(FILEPATH, fileName).size() == 0) { 
    shutDownComputer(times); 
    System.out.println(“计算机将在” + times + “秒内关闭”); 
    System.out.println(“输入任意内容可取消关闭计算机”); 
    if (null != scan.next()) { 
     unShutDownComputer(); 
    } 
    break; 
   } 
  } 
} 

// 利用线程休眠进行倒计时 
public boolean countDown(int second) { 
  for (int i = second; i >= 0; i–) { 
   try { 
    Thread.sleep(1000); 
    if (i == 0) { 
     return true; 
    } 
   } catch (InterruptedException e) { 
    e.printStackTrace(); 
   } 
  } 
  return false; 
} 



// 读取文件,查找下载的条目,返回List集合 
public List readText(String filePath, String searchWord) { 
  List list = new ArrayList(); 
  File file = new File(filePath); 
  InputStreamReader reader = null; 
  BufferedReader br = null; 
  try { 
   // downloads.txt文件采用Unicode编码,需要转码 
   reader = new InputStreamReader(new FileInputStream(file), “utf-16″); 
   br = new BufferedReader(reader); 
   String s1 = null; 
   while ((s1 = br.readLine()) != null) { 
    int position = s1.indexOf(searchWord); 
    if (position != -1) { 
     s1 = s1.substring(0, position).trim(); 
     list.add(s1); 

    } 
   } 
  } catch (UnsupportedEncodingException e) { 
   e.printStackTrace(); 
  } catch (FileNotFoundException e) { 
   e.printStackTrace(); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } finally { 
   try { 
    br.close(); 
    reader.close(); 
   } catch (IOException e) { 
    e.printStackTrace(); 
   } 

  } 

  return list; 

} 

// 查看当前下载的记录数 
public void showFile(List list) { 
  Iterator iter = list.iterator(); 
  int count = 1; 
  while (iter.hasNext()) { 
   System.out.println(count + “=>” + iter.next()); 
   count++; 
  } 
} 

// 关闭计算机 
public void shutDownComputer(int times) { 
  Runtime run = Runtime.getRuntime(); 
  try { 
   run.exec(“shutdown -s -t” + ” ” + times); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } 
} 

// 取消关闭计算机 
public void unShutDownComputer() { 
  Runtime run = Runtime.getRuntime(); 
  try { 
   run.exec(“shutdown -a”); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } 
} 

public static void main(String[] args) { 
  new ShutDown(); 

} 

} 


本想用property文件存配置信息,闲麻烦就没加,其实就用到倒计时和查询关键字2个方法就可以,用不着用scanner扫描键盘的录入.下载的时候cmd窗口开着,java ShutDown回车,安心的觉觉了.

代码有局限性,也不健壮,很多明显该添加的异常都没去管,觉得没必要,想自动关机的最简单的办法就是直接用迅雷下载.
水平有限,需要指点的地方,请留言!
分享到:
评论
22 楼 lz12366 2010-05-09  
实现的方法 真的很好!读取电驴的下载文件!呵呵!!
21 楼 isy 2010-05-08  
小刘而已 写道
要是有程序阻止关机怎么办呢。。。?

当t>0时,默认执行shutdown -f命令,强制关闭所有应用程序,可能有你说的阻止关机的程序,我没进行过其他环境测试
20 楼 小刘而已 2010-05-08  
要是有程序阻止关机怎么办呢。。。?
19 楼 isy 2010-04-13  
lyw985 写道
很有想法,赞一个。

另外:资源有时候会连接不到。。。。99%,LZ就关不了机了吗?

你可以加一个方法控制最长下载时间,时间到了无论下载完成与否直接执行shutDownComputer()方法
18 楼 lyw985 2010-04-13  
很有想法,赞一个。

另外:资源有时候会连接不到。。。。99%,LZ就关不了机了吗?
17 楼 keyboard2000 2010-04-12  
电驴正在下载的文件名不是有一定规则的吗?下载完成会hash通过后把文件名改成正常的
16 楼 dplead 2010-04-12  
楼主这种精神值得学习。。。
15 楼 Checkmate 2010-04-12  
1.可以试试批处理
at+shutdown

2.貌似Java已经有一个定时类了。
14 楼 playboyb 2010-04-12  
一直用迅雷下载东东。不过楼主的想法挺好的。学习了!
13 楼 isy 2010-04-12  
fishinsky 写道
支持一下,但是不得不说脚本更简单。

原来脚本的原理是检测temp文件夹,现在新版的电驴temp文件夹里已经没有正在下载的临时文件了,所以vbs已经不起作用了.
12 楼 andy54321 2010-04-12  
现在迅雷都可以下载任意类型的资源了吧
emule、bt、ftp、http
11 楼 fishinsky 2010-04-12  
支持一下,但是不得不说脚本更简单。
10 楼 luffyke 2010-04-12  
不错,有想法就最好了
9 楼 Angel_Night 2010-04-12  
以前都是用脚本的...

但是作为java程序员 支持一下...
8 楼 greatghoul 2010-04-12  
学习这种精神,但正如楼主所说,自动关机的话,用迅雷即可,反正也可以当驴使。
7 楼 bryande 2010-04-11  
LZ的研究精神非常值得学习
6 楼 isy 2010-04-10  
dongya1987 写道
好文,程序员就要以程序员的方式解决问题

thanks
5 楼 dongya1987 2010-04-10  
好文,程序员就要以程序员的方式解决问题
4 楼 isy 2010-04-10  
helin 写道
shutdown -s -f -t 0

我控制了关机的时间,在t>0时,默认执行-f命令
3 楼 helin 2010-04-09  
shutdown -s -f -t 0

相关推荐

Global site tag (gtag.js) - Google Analytics