java-File类

File类将文件和文件夹以及路径封装成对象,以提供更多的方法和属性来操作这些对象。File类不属于流对象,不能读写文件,但是可以作为参数传递给流对象的构造方法。

File学习的核心要点就是要熟练掌握其方法,配合其它对象,实现更多的功能。

一、File类中的静态常量

  1. Windows下:

    public static String separator,这是windows中的目录分隔符:\\

    public static String separatorChar和上面一样,类型不一样

    public stativ String pathSeparator,路径分隔符:;

    public stativ char pathSeparatorChar char类型的路径分隔符

  2. Linux下名字和类型都一样,只是值不一样。目录分隔符为:/路径分隔符为::

二、File类下的构造方法

  • File(String pathname)传递一个字符串类型的路径(路径可以目录的绝对地址,也可以是相对地址,更可以是文件,下同,都称之为路径),将次路径封装成为一个File对象
  • File(String parent, String child)传递字符串形式的子父路径,注意子和父是相对的概念
  • File(File parent, String child) 传递字符串形式的子和文件对象的父

三、File类的创建方法

以下方法,当目标路径存在时,均会返回false,创建成功返回true

  1. boolean createNewFile() 创建文件,注意也只能创建文件,并不能创建目录
  2. boolean mkdir()创建文件夹,注意只能创建一级目录
  3. boolean mkdirs()创建多级目录

四、File类的删除方法

  1. boolean delete() 删除指定目录或者文件,成功返回true,注意此删除不走回收站,文件夹不为空时没有办法删除
  2. void deleteOnExit() jvm退出前删除,个人感觉用处不是很广泛

五、File类的判断方法

  1. boolean exists()判断构造方法中封装的路径或者文件是否存在
  2. boolean isAbsolute() 判断构造方法中封装的路径是不是绝对路径,是返回真
  3. boolean isDirectory()判断是不是路径,是返回true
  4. boolean isFile() 判断是不是文件,是返回true
  5. boolean isHidden() 判断封装的路径(包括文件)是不是隐藏属性是返回true

六、File类的获取方法

  1. String getName() 获取封装路径最后部分的名字,此方法不会判断路径是否存在,使用之前最好判断,如果是文件的话当然获取到的也就是文件的名字了
  2. String getParent() 返回封装路径的父路径,注意封装的是相对路径时如果相对路径没有父路径,就会出错
  3. File getParentFile()返回封装路径的父路径的File对象
  4. String getAbsolutePath() 返回封装路径的绝对路径
  5. File getAbsoluteFile() 返回封装路径的绝对路径的File对象

七、File类的其他方法

  1. boolean renameTo(File f)重命名,File封装一个路径,这个对象调用renameTo(修改后的路径的File对象),修改成功返回真,失败返回假。修改名字后路径不同,方法renameTo带有剪切效果
  2. long lastModified()返回File构造方法封装的路径中文件的最后修改时间的毫秒值
  3. boolean setLastModified(long time)能查就能改

八、File的list方法

  1. static File[] listRoots() 静态的方法,列出系统所以的根,光驱和移动设备存储也会算进去
  2. String[] list()返回File构造方法封装的路径下的所有文件和文件夹
  3. File[] listFiles()返回File构造方法封装的路径下的所有文件和文件夹,返回的File的对象,带全路径。

注意:
如果空目录调用了listFiles(),会返回一个长度为0的File数组,但是如果是文件调用了此方法,则会返回null。前后两者是有实质性区别的。空目录是存在长度为0的数组,文件是不存在,也就是null;

九、list方法的文件过滤器

一般遍历目录时,只想要获取特定类型的文件,其他的文件都必须过滤掉,这个就是文件过滤器的用处。

FileFilter只是一个接口,使用的时候需要自己实现来达到过滤文件的目的。FileFilter接口下只有一个accept()方法,所以使用的时候可以考虑使用匿名内部类来实现。具体用法就是讲FileFilter接口的实现对象传入list方法中即可。

一般实现accept方法的时候,建议将封装了纯路径的对象返回为true,否则如果剔除掉子目录的话就没有办法递归进入到子目录下。

以上一到九标题下的所有练习全部提供在一个demo中:

package file;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Date;
import java.text.DateFormat;
/*
 * file的练习
 */
public class FileDemo {

    public static void main(String[] args) throws Exception {
        mehtod_8();
    }
    
    /*
     *  file类的四个静态常量
     *  public static String separator 与系统有关的目录分隔符 Windows中 :\ 
     *  public static char separatorChar Linux中: /
     *  public static String pathSeparator 与系统有关的路径分隔符 Windows中  ; 分号
     *  public static char pathSeparatorChar Linux中  : 冒号
     */
    public static void method(){
        File f = new File("E:\\");
        String s = f.separator;
        System.out.println(s);
        s = f.pathSeparator;
        System.out.println(s);
    }
    
    /*
     * file 类的构造方法
     * 1. File(String pathName)
     * 2. File(String parent, String child)
     * 3. File(File parent, String child)
     */
    public static void method_1(){
        File f = new File("E:\\gama");
        File f1 = new File("E:\\","game");
        File f2 = new File(f,"gama");
        System.out.println(f);
        System.out.println(f1);
        System.out.println(f2);
    }
    
    /* File类的创建方法 ,目标文件或者路径存在时,均会返回false
     *  1. boolean createNewFile() 创建文件,成功返回true
     *  2. boolean mkdir() 创建文件夹,成功返回true,只能创建一级目录
     *  3. boolean mkdirs() 创建多级文件夹
     */
    public static void method_2() throws IOException{
        File f = new File("E:\\TEST.md");
        System.out.println(f.createNewFile());
        
        File f1 = new File("E:\\TEST\\TEST\\TEST\\");
        System.out.println(f1.mkdirs());
    }
    
    /* File类的删除方法
     * 1. boolean delete() 删除指定目录或者文件,成功返回true,注意此删除不走回收站,文件夹不为空时没有办法删除
     * 2. void deleteOnExit() jvm退出前删除,
     */
    public static void method_3() throws Exception{
        File f = new File("E:\\1.txt");
        //System.out.println(f.delete());
        f.deleteOnExit();
        Thread.sleep(5000);
    }
    
    /* File类的判断方法
     * 1. boolean exists() 判断构造方法中封装的路径或者文件是否存在
     * boolean isAbsolute() 判断构造方法中封装的路径是不是绝对路径,是返回真
     * boolean isDirectory() 判断是不是路径,是返回true
     * boolean isFile() 判断是不是文件,是返回true
     * boolean isHidden() 判断封装的路径(包括文件)是不是隐藏属性是返回true
     */
    public static void method_4() throws Exception{
        File f = new File("E:\\a7d03c85ed46e9d87d8f766ec0be65de");
        
        System.out.println(f.exists());
        
        System.out.println(f.isAbsolute());
    }
    
    /*
     * File类的获取方法
     * 1.String getName() 获取封装路径最后部分的名字,此方法不会判断路径是否存在,使用之前最好判断
     * 2.String getParent() 返回封装路径的父路径
     * 3.File getParentFile() 返回封装路径的父路径的File对象
     * 4.String getAbsolutePath() 返回封装路径的绝对路径
     * 5.File getAbsoluteFile() 返回封装路径的绝对路径的File对象
     */
    public static void method_5() {
        File f = new File("src");
        System.out.println(f.getAbsoluteFile().getParent());
    }
    
    /*File的其他方法
     * 1.boolean renameTo(File f)重命名,File封装一个路径,这个对象调用renameTo(修改后的路径的File对象),
     *   修改成功返回真,失败返回假。修改名字后路径不同,方法renameTo带有剪切效果
     * 2.long lastModified()返回File构造方法封装的路径中文件的最后修改时间的毫秒值
     * 3.boolean setLastModified(long time) 能查就能改
     */
    public static void method_6() {
        File f = new File("H:\\project\\Demo\\src\\io\\BufferedReaderDemo.java");
        
        long time = f.lastModified();
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
        String date = df.format(new Date(time));
        
        System.out.println(date);
        
        f.setLastModified(new Date().getTime());

        date = df.format(new Date(f.lastModified()));
        System.out.println(date);
    }
    
    /*
     * File的list方法
     * 1. static File[] listRoots() 静态的方法,列出系统所以的根,光驱和移动设备存储也会算进去
     * 2. String[] list()返回File构造方法封装的路径下的所有文件和文件夹
     * 3. File[] listFiles()返回File构造方法封装的路径下的所有文件和文件夹,返回的Filed对象,带全路径
     */
    public static void method_7(){
        
        File[] roots = File.listRoots();
        
        for(File f: roots){
            System.out.println(f);
        }
    }
  
    /*
     * 文件过滤打印
     */
    public static void mehtod_8(){
        File dir = new File("G:\\");
        FilesFilter(dir);
    }
    
    //递归过滤方法的实现,选出目录下的*.java文件
    //直接使用匿名内部内实现了FileFilter接口
    public static void FilesFilter(File file) {
        File[] files = file.listFiles(
            new FileFilter(){
                public boolean accept(File pathname){ //使用匿名内部类实现文件过滤器的接口
                    if(pathname.getName().endsWith(".java") || pathname.isDirectory()){
                        return true;
                    }else{
                        return false;
                    }
                }
            });

        if (files != null) {
            for (File f : files) {
                if (f.isFile()) {
                    System.out.println(f);
                    
                } else
                    FilesFilter(f);
            }
        }
    
    }
}

十、递归方法

所谓递归就是方法自身调用自身,层层调用,知道最底层的方法完成后一层层的退出知道最外层方法结束。比较的常见的就是文件的遍历和实现斐波那契数列等等。

递归可以一定程度上减少代码量,提高代码的可读性,也容易实现。但是缺点就是不能递归太多次,否则方法调用太多会占用太多的系统资源。

下面给出一个递归遍历全盘的demo:

package file;
/*
 * 一个练习,统计电脑里面文件的总数
 * 思路:递归
 * 
 * 输出(感觉C盘部分文件没有统计到,有点少):
 * C:\目录下有文件:205263个
 * D:\目录下有文件:0个
 * E:\目录下有文件:34746个
 * F:\目录下有文件:3025个
 * G:\目录下有文件:5616个
 * H:\目录下有文件:141762个
 * 390412
 */
import java.io.File;

public class FileTest {
    public static void main(String[] args) {

        File[] files = File.listRoots();
        long filesNum = 0;
        long temp = 0;
        
        for (File f : files) {
            filesNum = filesNum + countFiles(f);
            System.out.println(f + "目录下有文件:" + (filesNum-temp) + "个");
            temp = filesNum;
        }
        System.out.println(filesNum);
    }

    public static long countFiles(File file) {

        long FilesNum = 0;

        File[] files = file.listFiles();

        if (files != null) {

            for (File f : files) {
                if (f.isFile()) {
                    FilesNum++;
                    
                } else
                    FilesNum = FilesNum + countFiles(f);
            }
        }
        return FilesNum;
    }

    /*
     * 斐波那契数列实现
     */
    public static int getSum(int months){ 
        if(months == 1 || months ==2)
            return 1;
        return getSum(months-1) + getSum(months-2);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • File类   File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都...
    琦琦出去玩了阅读 330评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,513评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,517评论 18 139
  • 眼看他起高楼,眼看他宴宾客,眼看他楼塌了,和几位老机关闲聊感触颇多,用十年富贵,换今后半生牢狱,值还是不值。
    师或阅读 159评论 0 0
  • 哈哈哈 我回来啦!!!如果可以的话,过年前后文章恢复更新。 好了回归正题 想想做过的决定 ,还是因为当初太幼稚。大...
    钰姑娘阅读 552评论 0 1