对IO中File的理解

IO的概述

  • 当需要把内存中的数据存储到持久化设备上这个动作称之为输出(写)Output操作。
  • 当把持久设备上的数据读取到内存中的这个动作称之为输入(读)Input操作。
    这种输入输出操作称之为IO操作

File与Stream的关系

IO也可以称作是File(文件)与Stream(流)。

输入流输出流

  • Java程序得到数据,称为输入流。
  • Java程序对外提供数据,称为输出流。


File简述

File存放数据与文件夹。
API的解释:File类是文件和目录路径名的抽象表示。
File可以代表:

  • 文件
  • 目录
  • 磁盘

File类的构造函数

File类的方法

返回值 方法名 描述
boolean canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。
boolean canRead() 测试应用程序是否可以读取由此抽象路径名表示的文件。
boolean canWrite() 测试应用程序是否可以修改由此抽象路径名表示的文件。
boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
boolean delete() 删除由此抽象路径名表示的文件或目录。
File getAbsoluteFile() 返回此抽象路径名的绝对形式。
String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
long getFreeSpace() 返回分区未分配的字节数 named此抽象路径名。
String getName() 返回由此抽象路径名表示的文件或目录的名称。
String getParent() 返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。
File getParentFile() 返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。
String getPath() 将此抽象路径名转换为路径名字符串。
long getTotalSpace() 通过此抽象路径名返回分区 named的大小。
long getUsableSpace() 返回上的分区提供给该虚拟机的字节数 named此抽象路径名。
boolean isDirectory() 测试此抽象路径名表示的文件是否为目录。
boolean isFile() 测试此抽象路径名表示的文件是否为普通文件。
boolean isHidden() 测试此抽象路径名命名的文件是否为隐藏文件。
long lastModified() 返回此抽象路径名表示的文件上次修改的时间。
long length() 返回由此抽象路径名表示的文件的长度。
String[] list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
String[] list(FilenameFilter filter) 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
static File[] listRoots() 列出可用的文件系统根。
boolean mkdir() 创建由此抽象路径名命名的目录。
boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
boolean renameTo(File dest) 重命名由此抽象路径名表示的文件。

获取文件信息

public class FileTest {
    public static void main(String[] args) {
        //创建文件对象
        File file = new File("FileTest.java");
        //获取文件的绝对路径,即全路径
        String absPath = file.getAbsolutePath();
        //File中封装的路径是什么获取到的就是什么。
        String path = file.getPath();
        //获取文件名称
        String filename = file.getName();
        //获取文件大小
        long size = file.length();

        System.out.println("absPath="+absPath);
        System.out.println("path="+path);
        System.out.println("filename="+filename);
        System.out.println("size="+size);
    }
}

文件和目录操作

public class FileTest {
    public static void main(String[] args) throws IOException {
        // 对文件或者文件加进行操作。
        File file = new File("d:\\file.txt");
        
        // 创建文件:如果文件不存在,创建 返回 true; 如果文件存在,则不创建 返回 false; 如果路径错误,IOException。
        boolean b1 = file.createNewFile();
        System.out.println("b1=" + b1);
        
        //-----------删除文件操作-------注意:不去回收站。慎用------
        boolean b2 = file.delete();
        System.out.println("b2="+b2);

        //-----------需要判断文件是否存在------------
        boolean b3 = file.exists();
        System.out.println("b3="+b3);

        //-----------对目录操作 创建,删除,判断------------
        File dir = new File("d:\\abc\\def");
        
        //mkdir()创建单个目录。//dir.mkdirs();创建多级目录
        boolean b4 = dir.mkdir();
        System.out.println("b4="+b4);
        
        //删除目录时,如果目录中有内容,无法直接删除。
        boolean b5 = dir.delete();
        
        //只有将目录中的内容都删除后,保证该目录为空。这时这个目录才可以删除。
        System.out.println("b5=" + b5);

        //-----------判断文件,目录------------
        File f = new File("d:\\java");// 要判断是否是文件还是目录,必须先判断存在。
        if(f.exists()) {
            System.out.println(f.isFile());
            System.out.println(f.isDirectory());
        }else{
//            f.createNewFile();
//            f.mkdirs();
        }

    }
}

注意:空目录才可删除
注意:判断文件是否是目录应该先判断是否存在

磁盘操作

public class FileTest {
    public static void main(String[] args) throws IOException {
        //获取当前所有的磁盘
        File []disks = File.listRoots();
        for (int i = 0; i < disks.length; i++) {
            System.out.println("盘符" + disks[i]);
            System.out.println(String.format("%s的容量是%d", disks[i], disks[i].getTotalSpace()
                                             / 1024 / 1024 / 1024));
            System.out.println(String.format("%s的已用的容量是%d", disks[i], disks[i].getFreeSpace()
                                             / 1024 / 1024 / 1024));
            System.out.println(String.format("%s的已用的容量是%d", disks[i], disks[i].getUsableSpace() 
                                             / 1024 / 1024 / 1024));
        }
    }
}

实现dir操作

public class FileTest {
    public static void main(String[] args) throws IOException {
        File dir = new File("d:\\tools");
        //获取的是目录下的当前的文件以及文件夹的名称。
        String[] names = dir.list();
        for(String name : names){
            System.out.println(name);
        }
        //获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
        File[] files = dir.listFiles();
        for(File file : files){
            System.out.println(file);
        }
    }
}

注意:在获取指定目录下的文件或者文件夹必须满足如下条件:

  • 指定目录必须存在
  • 指定的必须是目录否则容易返回数组为null,出现NullPointerException。

文件过滤

    通过listFiles()方法,我们可以获取到一个目录下的所有文件和文件夹,但能不能对其进行过滤呢?比如我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹呢?

    我们是可以先把一个目录下的所有文件和文件夹获取到,并遍历当前获取到所有内容,遍历过程中在进行筛选,但是这个动作有点麻烦,好在Java给我们提供相应的功能来解决这个问题。

    查阅File类的API,发现File类中重载的listFiles方法,并且接受指定的过滤器。

    过滤器有两种:

    (1)FilenameFilter:通过文件名过滤

    (2)FileFilter:通过文件对象过滤

显示D盘根目录下的所有Java源文件

public class FileTest {
    //定义类实现文件名称FilenameFilter过滤器
    static class MyFileNameFilter implements FilenameFilter{
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith("java");
        }
    }
    public static void main(String[] args) throws IOException {
        //获取扩展名为.java所有文件
        //创建File对象
        File file = new File("d:\\");
        //获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
        File[] files = file.listFiles(new MyFileNameFilter());
        //遍历获取到的所有符合条件的文件
        for (File f : files) {
            System.out.println(f);
        }
    }
}

显示D盘根目录下的所有目录

public class FileTest {
    //定义类实现文件名称FilenameFilter过滤器
    static class MyFileFilter implements FileFilter {

        @Override
        public boolean accept(File pathname) {
            return pathname.isDirectory();
        }
    }
    public static void main(String[] args) throws IOException {
        //显示D盘下的所有目录
        File file = new File("d:\\");
        File[] files = file.listFiles(new MyFileFilter());
        //遍历获取到的所有符合条件的文件
        for (File f : files) {
            System.out.println(f);
        }
    }
}

打印D盘下所有的文件

public class FileTest {
    public static void main(String[] args) {
        File file = new File("d:\\");
        getAllFile(file);
    }
    //获取指定目录以及子目录中的所有的文件
    public static void getAllFile(File file) {
        File[] files = file.listFiles();
        //遍历当前目录下的所有文件和文件夹
        if(files!=null) {
            for (File f : files) {
                if (f != null) {
                    //判断当前遍历到的是否为目录
                    if (f.isDirectory()) {
                        //是目录,继续获取这个目录下的所有文件和文件夹
                        getAllFile(f);
                    } else {
                        //不是目录,说明当前f就是文件,那么就打印出来
                        System.out.println(f);
                    }
                }
            }
        }
    }
}

打印指定目录下的所有java文件

public class FileTest {
    //文件名过滤器
    static class MyFilenameFilter implements FilenameFilter{
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".java");
        }
    }
    public static void main(String[] args) {
        File file = new File("d:\\");
        getAllFile(file);
    }
    //获取指定目录以及子目录中的所有的文件
    public static void getAllFile(File file) {
        //根据文件名过滤器获取文件
        File[] files = file.listFiles(new MyFilenameFilter());
        //遍历当前目录下的所有文件和文件夹
        if(files!=null) {
            for (File f : files) {
                if (f != null) {
                    //判断当前遍历到的是否为目录
                    if (f.isDirectory()) {
                        //是目录,继续获取这个目录下的所有文件和文件夹
                        getAllFile(f);
                    } else {
                        //不是目录,说明当前f就是文件,那么就打印出来
                        System.out.println(f);
                    }
                }
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 1.1File类概述和构造方法 File类介绍它是文件和目录路径名的抽象表示文件和目录是可以通过File封装成对象...
    黑夜中的黑眼睛阅读 303评论 0 1
  • 第十七天进程和线程-------- 1.进程: 就是正在运行的程序,分配内存让应用程序能够运行。 Windows系...
    枇杷树8824阅读 998评论 0 0
  • 1.File类 1.1File类概述和构造方法【应用】 File类介绍它是文件和目录路径名的抽象表示文件和目录是可...
    眼若繁星丶阅读 226评论 0 1
  • Maven依赖 static String pathSeparator 与系统有关的路径分隔符,为了方便,它表示...
    suger饭团阅读 408评论 0 1
  • File类 - IO Stream的基础 File类的概述和构造函数File类介绍1.它是文件和目录路径名的抽象表...
    七喜丶阅读 126评论 0 1