A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李阳 中级黑马   /  2013-3-12 02:03  /  1692 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李阳 于 2013-3-12 15:02 编辑
  1. import java.io.*;
  2. class FileDemo3
  3. {
  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                 File f = new File("d:\\QQ");
  7.                 BufferedWriter buff = new BufferedWriter(new FileWriter("in.txt"));
  8.                 getFile(f,buff,0);
  9.                
  10.         }
  11.         public static String getLevel(int level)
  12.         {
  13.                 StringBuilder sb = new StringBuilder();
  14.                
  15.                 for (int x=0;x<=level;x++ )
  16.                 {
  17.                         if (x==level)
  18.                         {
  19.                                 sb.append("|--");
  20.                         }
  21.                         else
  22.                                 sb.append("  ");
  23.                 }
  24.                 return sb.toString();
  25.         }
  26.         public static void getFile(File f,BufferedWriter buff,int level) throws IOException
  27.         {
  28.                 //执行做法1代码,做法2代码注释掉,效果请看效果1
  29.                 buff.write(getLevel(level)+f.toString());
  30.                 buff.newLine();
  31.                 buff.flush();
  32.                 level++;
  33.                 //PrintStream pm = System.out;
  34.                 //BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(pm));
  35.                 File[] files = f.listFiles();
  36.                 for (File fs:files )
  37.                 {
  38.                         if (fs.isDirectory())
  39.                         {
  40.                                 /*
  41.                                 //使用做法2,请看效果2.把做法1的代码注释掉,
  42.                                 buff.write(getLevel(level)+f.toString());
  43.                                 buff.newLine();
  44.                                 buff.flush();
  45.                                */
  46.                                 getFile(fs,buff,level);
  47.                         }
  48.                         else
  49.                         {
  50.                                                                
  51.                                 //bufw.write(fs.toString());
  52.                                 buff.write(getLevel(level)+fs.toString());
  53.                                 buff.newLine();
  54.                                 //bufw.newLine();
  55.                                 //bufw.flush();
  56.                                 buff.flush();
  57.                         }
  58.                 }
  59.         }
  60. }
复制代码
扫描QQ文件夹下的所有文件,并保存在文件中。代码无误。
为神马做法2比做法1少文件呢?
做法1效果图
  1. |--d:\QQ
  2.   |--d:\QQ\af.xml.txd
  3.   |--d:\QQ\app.xml.txd
  4.   |--d:\QQ\AuI18N
  5.     |--d:\QQ\AuI18N\2052
  6.       |--d:\QQ\AuI18N\2052\StringBundle.xml
  7.     |--d:\QQ\AuI18N\config.xml
  8.   |--d:\QQ\Bin
复制代码
下面是效果2
  1. |--d:\QQ\af.xml.txd
  2.   |--d:\QQ\app.xml.txd
  3.   |--d:\QQ
  4.     |--d:\QQ\AuI18N
  5.       |--d:\QQ\AuI18N\2052\StringBundle.xml
  6.       ------少了一个文件夹d:\QQ\AuI18N\2052--------
  7.     |--d:\QQ\AuI18N\config.xml
  8.   |--d:\QQ
  9.     |--d:\QQ\Bin\ABL.sys
复制代码

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

3 个回复

倒序浏览
看不出你怎么样是做法1   怎么样是做法2     做法1  是不是不要做法2 用多行注释符注释的那段代码?    做法2是多添上那些代码?

如果按我说的  做法1  就是OK 的

那你的做法2  应该不是我说的这样  因为那样和你的效果2不一样    你的做法2是什么   能说清楚点吗

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
其实这两种方法都是差不多的,29行~31行的代码其实是没有必要的
因为如果是文件的话,listFiles()根本没有执行下面的for循环。

如果不放心的话,可以if判断中计数,可以知道,列出的文件个数是一样的。

我写了一下程序,不知道有没有帮助:
  1. public static void getFile(File f, BufferedWriter buff, int level) throws IOException {
  2. // 如果是目录
  3.                 if (f.isDirectory()) {
  4.                         ++level;
  5.                         for(File fs : f.listFiles()){
  6.                                 getFile(fs, buff, level);
  7.                         }
  8.                 } else { // 如果是文件
  9.                         ++count;        //统计文件的数目
  10.                        
  11.                         buff.write(getLevel(level) + f.toString());
  12.                         buff.newLine();
  13.                         buff.flush();
  14.                 }
  15.         }
复制代码
回复 使用道具 举报
其实这两种方法都是差不多的,29行~31行的代码其实是没有必要的
因为如果是文件的话,listFiles()根本没有执行下面的for循环。

如果不放心的话,可以if判断中计数,可以知道,列出的文件个数是一样的。

我写了一下程序,不知道有没有帮助:
  1. public static void getFile(File f, BufferedWriter buff, int level) throws IOException {
  2. // 如果是目录
  3.                 if (f.isDirectory()) {
  4.                         ++level;
  5.                         for(File fs : f.listFiles()){
  6.                                 getFile(fs, buff, level);
  7.                         }
  8.                 } else { // 如果是文件
  9.                         ++count;        //统计文件的数目
  10.                        
  11.                         buff.write(getLevel(level) + f.toString());
  12.                         buff.newLine();
  13.                         buff.flush();
  14.                 }
  15.         }
复制代码

点评

只要参与就好。  发表于 2013-3-12 13:28

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马