how2j.cn


工具版本兼容问题
文件和文件夹都是用File代表

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



14分55秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



步骤 1 : 创建一个文件对象   
步骤 2 : 文件常用方法1   
步骤 3 : 文件常用方法2   
步骤 4 : 练习-遍历文件夹   
步骤 5 : 答案-遍历文件夹   
步骤 6 : 练习-遍历子文件夹   
步骤 7 : 答案-遍历子文件夹   

步骤 1 :

创建一个文件对象

使用绝对路径或者相对路径创建File对象
创建一个文件对象
package file; import java.io.File; public class TestFile { public static void main(String[] args) { // 绝对路径 File f1 = new File("d:/LOLFolder"); System.out.println("f1的绝对路径:" + f1.getAbsolutePath()); // 相对路径,相对于工作目录,如果在eclipse中,就是项目目录 File f2 = new File("LOL.exe"); System.out.println("f2的绝对路径:" + f2.getAbsolutePath()); // 把f1作为父目录创建文件对象 File f3 = new File(f1, "LOL.exe"); System.out.println("f3的绝对路径:" + f3.getAbsolutePath()); } }
package file;
 
import java.io.File;
 
public class TestFile {
 
    public static void main(String[] args) {
        // 绝对路径
        File f1 = new File("d:/LOLFolder");
        System.out.println("f1的绝对路径:" + f1.getAbsolutePath());
        // 相对路径,相对于工作目录,如果在eclipse中,就是项目目录
        File f2 = new File("LOL.exe");
        System.out.println("f2的绝对路径:" + f2.getAbsolutePath());
 
        // 把f1作为父目录创建文件对象
        File f3 = new File(f1, "LOL.exe");
 
        System.out.println("f3的绝对路径:" + f3.getAbsolutePath());
    }
}
步骤 2 :

文件常用方法1

注意1: 需要在D:\LOLFolder确实存在一个LOL.exe,才可以看到对应的文件长度、修改时间等信息

注意2: renameTo方法用于对物理文件名称进行修改,但是并不会修改File对象的name属性。
文件常用方法1
package file; import java.io.File; import java.util.Date; public class TestFile { public static void main(String[] args) { File f = new File("d:/LOLFolder/LOL.exe"); System.out.println("当前文件是:" +f); //文件是否存在 System.out.println("判断是否存在:"+f.exists()); //是否是文件夹 System.out.println("判断是否是文件夹:"+f.isDirectory()); //是否是文件(非文件夹) System.out.println("判断是否是文件:"+f.isFile()); //文件长度 System.out.println("获取文件的长度:"+f.length()); //文件最后修改时间 long time = f.lastModified(); Date d = new Date(time); System.out.println("获取文件的最后修改时间:"+d); //设置文件修改时间为1970.1.1 08:00:00 f.setLastModified(0); //文件重命名 File f2 =new File("d:/LOLFolder/DOTA.exe"); f.renameTo(f2); System.out.println("把LOL.exe改名成了DOTA.exe"); System.out.println("注意: 需要在D:\\LOLFolder确实存在一个LOL.exe,\r\n才可以看到对应的文件长度、修改时间等信息"); } }
步骤 3 :

文件常用方法2

package file; import java.io.File; import java.io.IOException; public class TestFile { public static void main(String[] args) throws IOException { File f = new File("d:/LOLFolder/skin/garen.ski"); // 以字符串数组的形式,返回当前文件夹下的所有文件(不包含子文件及子文件夹) f.list(); // 以文件数组的形式,返回当前文件夹下的所有文件(不包含子文件及子文件夹) File[]fs= f.listFiles(); // 以字符串形式返回获取所在文件夹 f.getParent(); // 以文件形式返回获取所在文件夹 f.getParentFile(); // 创建文件夹,如果父文件夹skin不存在,创建就无效 f.mkdir(); // 创建文件夹,如果父文件夹skin不存在,就会创建父文件夹 f.mkdirs(); // 创建一个空文件,如果父文件夹skin不存在,就会抛出异常 f.createNewFile(); // 所以创建一个空文件之前,通常都会创建父目录 f.getParentFile().mkdirs(); // 列出所有的盘符c: d: e: 等等 f.listRoots(); // 刪除文件 f.delete(); // JVM结束的时候,刪除文件,常用于临时文件的删除 f.deleteOnExit(); } }
步骤 4 :

练习-遍历文件夹

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
一般说来操作系统都会安装在C盘,所以会有一个 C:\WINDOWS目录。

遍历这个目录下所有的文件(不用遍历子目录)

找出这些文件里,最大的和最小(非0)的那个文件,打印出他们的文件名

注: 最小的文件不能是0长度
练习-遍历文件夹
步骤 5 :

答案-遍历文件夹

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

3分6秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


package file; import java.io.File; public class TestFile { public static void main(String[] args) { File f = new File("c:\\windows"); File[] fs = f.listFiles(); if(null==fs) return; long minSize = Integer.MAX_VALUE; long maxSize = 0; File minFile = null; File maxFile = null; for (File file : fs) { if(file.isDirectory()) continue; if(file.length()>maxSize){ maxSize = file.length(); maxFile = file; } if(file.length()!=0 && file.length()<minSize){ minSize = file.length(); minFile = file; } } System.out.printf("最大的文件是%s,其大小是%,d字节%n",maxFile.getAbsoluteFile(),maxFile.length()); System.out.printf("最小的文件是%s,其大小是%,d字节%n",minFile.getAbsoluteFile(),minFile.length()); } }
步骤 6 :

练习-遍历子文件夹

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
同上的练习,要求遍历子文件夹
步骤 7 :

答案-遍历子文件夹

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

3分36秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


使用递归来进行文件夹的遍历
package file; import java.io.File; public class TestFile { static long minSize = Integer.MAX_VALUE; static long maxSize = 0; static File minFile = null; static File maxFile = null; //使用递归来遍历一个文件夹的子文件 public static void listFiles(File file){ if(file.isFile()){ if(file.length()>maxSize){ maxSize = file.length(); maxFile = file; } if(file.length()!=0 && file.length()<minSize){ minSize = file.length(); minFile = file; } return; } if(file.isDirectory()){ File[] fs = file.listFiles(); if(null!=fs) for (File f : fs) { listFiles(f); } } } public static void main(String[] args) { File f = new File("c:\\windows"); listFiles(f); System.out.printf("最大的文件是%s,其大小是%,d字节%n",maxFile.getAbsoluteFile(),maxFile.length()); System.out.printf("最小的文件是%s,其大小是%,d字节%n",minFile.getAbsoluteFile(),minFile.length()); } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-08-13 交作业
tyf



单独抽离出递归遍历获取目录下所有子文件夹的方法; 首先使用此方法获取所有文件, 然后遍历所有文件获取到最大文件和最小文件(如果有多个大小相同的文件则全部遍历输出). 效率很低
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class Test {
    /* 递归遍历目录方法 */
    private static File[] queryDirectory (File f) {
        File[] fs = new File[0];
        File[] files = f.listFiles();
        if (null != files) {
            for (File fChild: files) {
                File[] fChildren = fChild.isDirectory() ? queryDirectory(fChild) : new File[]{fChild};
                int temp = fs.length;
                fs = Arrays.copyOf(fs, temp + fChildren.length); // 网上查到的数组扩容方法
                System.arraycopy(fChildren, 0, fs, temp, fChildren.length);
            }
        }
        return fs;
    }

    public static void main(String[] args) {
        Date startTime = new Date();
        File windows = new File("C:/Windows");
        Date queryStartTime = new Date();
        File[] fs = queryDirectory(windows); // 调用递归方法
        System.out.printf("递归方法耗费 %d ms %n", System.currentTimeMillis() - queryStartTime.getTime());
        // 获取第一个 length 不为 0 的 File 对象, 初始化最大文件和最小文件
        File[] maxFile = new File[1];
        File[] minFile = new File[1];
        for (File f: fs) {
            if (f.length() > 0) {
                maxFile[0] = f;
                minFile[0] = f;
                break;
            }
        }
        // 遍历递归获取到的所有文件, 得到最大文件和最小文件
        for (File f: fs) {
            if (f.length() > 0) {
                if (f.length() > maxFile[0].length()) {
                    maxFile = new File[]{f};
                } else if (f.length() == maxFile[0].length()) {
                    maxFile = Arrays.copyOf(maxFile, maxFile.length + 1);
                    maxFile[maxFile.length - 1] = f;
                }
                if (f.length() < minFile[0].length()) {
                    minFile = new File[]{f};
                } else if (f.length() == minFile[0].length()) {
                    minFile = Arrays.copyOf(minFile, minFile.length + 1);
                    minFile[minFile.length - 1] = f;
                }
            }
        }
        if (maxFile.length == 1) {
            System.out.printf("最大的文件是%s, 其大小是%d字节%n", maxFile[0].getAbsolutePath(), maxFile[0].length());
        } else {
            System.out.println("最大的文件有:");
            for (File f: maxFile) {
                System.out.printf("%s, 大小: %d 字节%n", f.getAbsolutePath(), f.length());
            }
        }
        if (minFile.length == 1) {
            System.out.printf("最小的文件是%s, 其大小是%d字节%n", minFile[0].getAbsolutePath(), minFile[0].length());
        } else {
            System.out.println("最小的文件有:");
            for (File f: minFile) {
                System.out.printf("%s, 大小: %d 字节%n", f.getAbsolutePath(), f.length());
            }
        }
        System.out.printf("程序总共耗费 %d ms %n", System.currentTimeMillis() - startTime.getTime());
    }
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-10 交作业,第二题
tyf



单独抽离出递归遍历文件夹的方法, 返回文件夹下全部文件 再遍历全部文件取到最大文件和最小文件 效率有点低 递归方法耗时 36135 ms 程序总共耗时 142002 ms
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Date startTime = new Date();

        File windows = new File("C:/Windows");

        SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss SSS");
        Date queryStartTime = new Date();
        File[] fs = queryDirectory(windows); // 调用递归方法
        Date queryEndTime = new Date();

        System.out.printf("递归方法耗费 %d ms %n", queryEndTime.getTime() - queryStartTime.getTime());

        // 获取第一个 length 不为 0 的 File 对象, 初始化最大文件和最小文件
        File maxFile = fs[0];
        File minFile = fs[0];
        for (File f: fs) {
            if (null != f) {
                if (f.length() > 0) {
                    maxFile = f;
                    minFile = f;
                    break;
                }
            }
        }

        // 遍历递归获取到的所有文件, 得到最大文件和最小文件
        for (File f: fs) {
            if (f.length() > 0) {
                if (f.length() > maxFile.length()) {
                    maxFile = f;
                }
                if (f.length() < minFile.length()) {
                    minFile = f;
                }
            }
        }

        System.out.printf("最大的文件是%s, 其大小是%d字节%n", maxFile.getAbsolutePath(), maxFile.length());
        System.out.printf("最小的文件是%s, 其大小是%d字节%n", minFile.getAbsolutePath(), minFile.length());

        Date endTime = new Date();
        System.out.printf("程序总共耗费 %d ms %n", endTime.getTime() - startTime.getTime());
    }

    /* 递归遍历目录方法 */
    private static File[] queryDirectory (File f) {
        File[] fs = new File[0];
        File[] files = f.listFiles();
        if (null != files) {
            for (File fChild: files) {
                File[] fChildren = fChild.isDirectory() ? queryDirectory(fChild) : new File[]{fChild};
                int temp = fs.length;
                fs = Arrays.copyOf(fs, temp + fChildren.length); // 网上查到的数组扩容方法
                System.arraycopy(fChildren, 0, fs, temp, fChildren.length);
            }
        }
        return fs;
    }
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-06 交作业 遍历文件夹
2018-07-29 欢迎交流
2018-07-28 交作业
2018-07-19 题目答案
2018-07-16 作业遍历子文件夹
2018-07-16 站长,问下这个min值
2018-07-15 遍历文件夹作业
2018-07-11 createNewFile报错 Unhandled exception type IOException
2018-07-03 答案和解答,但是不明白遍历子文件夹是什么意思
2018-06-30 能看懂别人写的递归,自己却写不出来
2018-06-17 测试了一下自己写的性能
2018-06-17 自己写的测试了一下性能
2018-06-05 renameTo方法用于对物理文件名称进行修改,但是并不会修改File对象的name属性。如何理解
2018-06-05 renameTo方法用于对物理文件名称进行修改,但是并不会修改File对象的name属性。如何理解
2018-05-30 感觉答案错了
2018-05-14 请问什么是File对象的name属性?
2018-05-01 不是提问,只是给大家一个警示,千万不要像我这样干
2018-05-01 作业-遍历子文件夹-不能运行
2018-04-30 关于File类的疑问,急
2018-04-27 作业-步骤4(遍历文件夹),出现了奇怪的的问题,请大家帮忙,谢谢。
2018-04-27 【交作业】 练习2:遍历所有子文件夹(遍历指定目录下所有文件,含所有子目录)
2018-04-25 练习 希望可以把
2018-04-24 如何获得子目录内的文件?
2018-04-12 这种思路有问题吗?
2018-04-09 最后一题求解答 为什么我这个不行。。求解答 过两天回来看回复
2018-04-04 作业-遍历子文件夹
2018-04-04 作业-遍历文件夹
2018-04-03 交作业,第二题
2018-04-03 交作业,第一题
2018-03-25 交作业交作业
2018-03-24 交作业
2018-03-10 为什么我这个String不行,必须要File
2018-03-09 关于遍历子文件夹的疑问
2018-02-27 文件.length() 是说长度还是大小(字节)?
2018-01-01 站长大人!关于return
2017-12-30 欢迎大家提提建议
2017-12-16 f.getParentFile().mkdirs()会创建某文件,按字面理解它只能创建父文件夹吧
2017-12-07 基于站长大人的代码进行改进,欢迎大家参观、指正
2017-12-07 基于站长代码进行完善,欢迎大家参观、指正
2017-12-07 把f1作为父目录创建文件对象 有什么意思吗?
2017-12-04 求站长大神翻牌。照着站长的程序写的,为啥我的就报异常
2017-12-04 求站长大人与大神翻牌,为啥我写的就有异常?照着站长的答案写的啊
2017-11-24 关于递归
2017-11-21 再给大家分享下递归遍历文件夹的JAVA代码 按照文件的层级结构
2017-11-21 file.length()!=0 && file.length()<minSize 判断最小文件不明白
2017-10-20 关于笔记跳到页面顶部
2017-10-15 速度太慢
2017-10-15 return的作用是啥?
2017-10-11 代码问题
2017-09-29 各位大侠求救!!!!!我盗梦空间没了。
2017-09-27 站长输出的问题
2017-09-21 创建文件引用时编译不了
2017-09-19 (遍历文件夹)我这样写是不是太麻烦了。。。
2017-09-18 有关空指针异常的说明以及给各位战友安利个网站
2017-09-16 用file.length()查看的文件大小总是4096
2017-09-03 这边图中的mkdir和mkdirs的注释是不是错了?
2017-08-20 老师,为什么这样创建不了文件
2017-07-26 File[]fs= f.listFiles();返回值的问题
2017-07-25 第一题作业
2017-07-14 写了一个递归,比较乱,trycatch添加在获取到file数组那里就可以了吧
2017-04-13 为什么第二问的代码运行出现空指针异常??
2017-04-06 如下
2017-02-16 递归不太懂
2017-02-10 怎么才能不使用全局变量?
2016-11-12 练习-遍历文件夹
2016-07-28 关于\和/的疑问
2016-06-30 Integer.MAX_VALUE要是每个文件都比这个大怎么办
2016-06-08 报错,复制答案也报错




提问之前请登陆
关于 JAVA 中级-I/O-文件对象 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 620943819
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图