黑马程序员技术交流社区

标题: [已解决]关于File和Runtime [打印本页]

作者: 蓝迪    时间: 2012-8-29 11:24
标题: [已解决]关于File和Runtime
本帖最后由 蓝迪 于 2012-8-29 14:56 编辑
  1. /*
  2. 用递归算法扫描文件夹里的可执行文件
  3. 然后用Runtim方法执行它
  4. */
  5. import java.io.*;

  6. class FileText
  7. {
  8. public static void main(String[] args) throws Exception
  9. {
  10. File f = new File("g:\\xuexi\\java1\\day20");//扫描day20文件夹
  11. method(f);
  12. }
  13. public static void method(File dir)throws Exception
  14. {

  15. File[] files = dir.listFiles();//创建数组接收返回的文件对象
  16. for (int x=0; x<files.length ; x++)
  17. {
  18. if (files[x].isDirectory())//如果返回的是文件夹,则继续递归
  19. method(files[x]);
  20. else
  21. if (files[x].canExecute())//如果返回的是文件,则判断文件是否可执行
  22. {
  23. String s = files[x].getName();//接收可执行文件的文件名
  24. System.out.println("s=="+s);
  25. Runtime r = Runtime.getRuntime();
  26. Process p = r.exec(s);
  27. Thread.sleep(4000);//让进程休息4秒
  28. p.destroy();//杀掉子进程
  29. }
  30. else
  31. System.out.println(files[x]);
  32. }
  33. }
  34. }
复制代码
看了毕老师的视频,然后自己做了这个练习
需求是:扫描指定文件夹里的文件,如果是文件夹则继续递归
如果是文件,则判断文件是否可执行
若可执行,则用Runtime类执行

我编译成功了,但是运行中间出现问题,到底是什么原因,我的思路和代码有问题吗

作者: 蓝迪    时间: 2012-8-29 11:28
本帖最后由 蓝迪 于 2012-8-29 13:07 编辑

怎么把扫描到的文件都运行一次, .txt .exe .java 不管类型,怎么修改那代码?

作者: 唐志兵    时间: 2012-8-29 11:29
本帖最后由 唐志兵 于 2012-8-29 12:06 编辑

需要打印文件层次的话可以用我的这种方法。至于那个runtime我就不写了。不然一个目录中有几百个exe文件,那一运行就悲剧了。。下面是输出结果图片。
  1. import java.io.File;

  2. /**

  3. /**
  4. * @author Administrator
  5. *
  6. */
  7. public class filePrint {
  8. public static int num = 1;

  9. public static void main(String[] args) {
  10. File file = new File("D:\\驱动精灵");
  11. System.out.println(file.getPath());
  12. enumFile(file);
  13. }

  14. public static void enumFile(File file){
  15. File[] list = file.listFiles();
  16. for (int i = 0; i < list.length; i++) {
  17. printTab(num);
  18. if (list[i].isDirectory()) {
  19. System.out.println("文件夹:" + list[i].getName() + "\\");
  20. num++;
  21. enumFile(list[i]);
  22. num--;
  23. }else
  24. System.out.println(list[i].getName());
  25. }
  26. }

  27. public static void printTab(int num){
  28. for (int i = 0; i < num; i++) {
  29. System.out.print("\t");
  30. }
  31. }
  32. }
复制代码

作者: 周兴华    时间: 2012-8-29 12:20
以上是以文本文件为例来说明的,下面是我自己写的验证代码,楼主可以试试看
import java.io.*;
public class RuntimeDemo {
public static void main(String[] args) throws Exception{
  Runtime r=Runtime.getRuntime();
  Process p=r.exec("notepad D:\\IOTest\\1.txt");
  Thread.sleep(3000);
  p.destroy();
  
  File f=new File("D:\\IOTest\\1.txt");
  System.out.println(f.canExecute());
}
}


作者: 周兴华    时间: 2012-8-29 14:08
周兴华 发表于 2012-8-29 12:20
  • if (files[x].canExecute())   //如果返回的是文件,则判断文件是否可执行,假设当前的文件为“D:\\1.tx ...

  • 我的想法是要写个方法,根据文件的后缀名来选择改用哪个执行软件来打开文件,但这样写的话如果碰到一个后缀名不知道改用哪个软件去打开它时就得将异常抛出。以上是我自己的想法,应该有更好的做法吧。
    作者: 周兴华    时间: 2012-8-29 14:19
    周兴华 发表于 2012-8-29 14:08
    我的想法是要写个方法,根据文件的后缀名来选择改用哪个执行软件来打开文件,但这样写的话如果碰到一个后 ...

    楼主可以讲r.exec(sb);里的变量sb先定义成StringBuilder类型的对象,然后调用append方法即可将文件名添加进去。在毕老师的视频里有关于String类型很详细的讲解,楼主可参考下。




    欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2