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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

看到很多人和我遇到类似的问题,特意写一个例子来和大家一起分享,欢迎大家指点交流
import java.io.File;
import java.util.Comparator;
import java.util.TreeSet;

public class Test3 {

        /**
         * 盘符下查找所有java开头的文件名并排序
         */
        public static void main(String[] args) {
                File dir = new File("D:\\");        //指定文件目录
                TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
                        @Override
                        public int compare(String o1, String o2) {
                                return o1.length()>o2.length()?1:-1;//比较文件名长度,名字长的存到后面
                        }
                });                //创建TreeSet集合,自定义比较器
                print(dir,ts);        //调用遍历文件夹的方法
                for (String string : ts) {        //遍历TreeSet集合,打印出集合中的所有元素
                        System.out.println(string);
                }
        }
        public static void print(File dir,TreeSet<String> ts){        //传入文件夹和TreeSet集合
                File[] files = dir.listFiles();                //获取集合中的所有文件存入文件数组
                if(files!=null){                                        //如果文件数组不为空
                        for (File file : files) {                //遍历文件数组
                                if(file.isFile()&&file.getName().startsWith("java")){//符合条件的文件就将文件名加入到TreeSet集合中,集合会根据文件名长度自动排序
                                        ts.add(file.getName());
                                }else if(file.isDirectory()){//如果文件是子文件夹,就递归调用本方法
                                        print(file,ts);
                                }
                        }
                }
        }
}

8 个回复

倒序浏览
这里面还是有问题的吧,如果你的D盘文件过多,那么会有空指针异常的
回复 使用道具 举报
Daveweil 发表于 2016-10-3 13:27
这里面还是有问题的吧,如果你的D盘文件过多,那么会有空指针异常的

不会呀,在遍历文件之前我有做判断是否为空的
回复 使用道具 举报
读书可以当饭吃 发表于 2016-10-6 11:35
不会呀,在遍历文件之前我有做判断是否为空的

我的意思是,如果你的盘符中文件过多,达到一定程度就会空指针异常
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
Daveweil 发表于 2016-10-6 12:15
我的意思是,如果你的盘符中文件过多,达到一定程度就会空指针异常

这我不太懂哦,这是为什么呢?
回复 使用道具 举报
读书可以当饭吃 发表于 2016-10-7 00:23
这我不太懂哦,这是为什么呢?

我也不太清楚,但是确实是这样,代码没有错误,但是会出空指针,我们技术论坛老师说的
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
[AppleScript] 纯文本查看 复制代码
public class Day39_9月点招题一3 {

    /**
     * @author purity 2016-10-7下午2:50:54
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        File dir = getDir("P:\\传智播客\\前期培优班\\27天笔记");
        TreeSet<String> ts = new TreeSet<>(new CompareByLen());
        TreeSet<String> _ts = toFileNameStoreSet(dir, ts);
        for (String file : _ts) {
            System.out.println(file);
        }
    }

    public static File getDir(String fileName) {
        File dir = new File(fileName);
        if (!dir.exists()) {
            System.out.println("不存在");
        } else if (!dir.isDirectory()) {
            System.out.println("不是目录");
        }
        return dir;
    }

    public static TreeSet<String> toFileNameStoreSet(File dir, TreeSet<String> ts) {
        File[] subFiles = dir.listFiles();
        for (File subFile : subFiles) {
            if (subFile.isFile() && subFile.getName().endsWith(".java")) {
                ts.add(subFile.getName());
            } else {
                if (subFile.isDirectory())
                    toFileNameStoreSet(subFile, ts);
            }
        }
        return ts;
    }
}

class CompareByLen implements Comparator<String> {
    @Override
    public int compare(String lhs, String rhs) {
        int len = lhs.length() - rhs.length();
        return len == 0 ? lhs.compareTo(rhs) : len;
    }

}
回复 使用道具 举报
pdog 初级黑马 2016-10-8 01:08:15
8#
Daveweil 发表于 2016-10-7 09:08
我也不太清楚,但是确实是这样,代码没有错误,但是会出空指针,我们技术论坛老师说的
...

没有听说过有这样的情况  你应该是记错了,或者老师说错了
回复 使用道具 举报
pdog 初级黑马 2016-10-8 01:12:43
9#
楼主只判断了 File数组是否为空

如果读取到了没有权限的文件,这时候会返回null,遍历的时候就会nullpointerexception了

所以在增强for里面再添加一个file != null的判断来排除这个情况

//如果你D盘没有这种没有权限的文件,可以在C盘根目录 来试一次.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马