关于文件的操作(java)

  对文件的操作从本质上和前面解析的各种类有着本质的区别。前面所有类的操作都是基于计算机的内存,只要断电,所有数据都消失。而对于文件来讲,计算机是储存在磁盘上。

  先来简单的说说内存和磁盘(硬盘),因为这会在文件读写的速度上有着很大的影响。首先要说内存和硬盘都用来储存数据的,但是为什么还有区分成两者呢?大家都应该知道,计算机本身的操作都是靠着电路实现的,cpu对于电的操作反应速度是很快的,内存其实就是电路组成,这样会使得cpu对于内存的反应操作的速度巨快,但是也会带来一个问题,只要断电,所有在内存上的数据都会消失,这也就是大家平时在写文档时,没有立即保存电脑强制关机重启后,文档内未保存的内容全部消失的原因。正是因为内存会出现这种问题,所有提出了磁盘,也就是硬盘。硬盘是由磁组成的,上面存着都是磁信号(南北极也是两种状态可以代替电路的通断两种状态表示0和1)。大家看到的C盘多少个G,D盘多少G,都是指磁盘。因为上面是磁性号,这样断电之后,所有的数据都是保存下来的。但是硬盘有一个问题,就是因为它是磁信号,cpu必须得先将电信号转换为磁信号才能刻录在磁盘上,这也就意味着cpu对于磁盘的处理速度远远慢与磁盘。我们现在对于电脑的操作,基本上都是先在内存上处理部分数据后再储存在硬盘上。

  上面说简单的阐述了一下自己对于磁盘和硬盘的理解后,再来说说java对于文件的处理。
  java说一切皆对象,那么每一个文件就是一个对象。
  java.io.File就是文件类。
  使用File可以:
    1.访问文件或目录的属性(如:大小,名字,修改时间等)
    2.操作文件或目录(创建,删除文件和目录)
    3.访问目录中的所有内容
  **但是不可以: 访问文件数据(即对文件的读写)**
  File类的**注意事项**:
  1.**文件路径的书写**(见构造方法)
  2.file.delete()**只能删除空目录**(见demo5)和**不为空的目录删除**(见demo8)(**递归**)
  3.file.mkdir()和dir.mkdiers()的区别(见demo5)(**file.mkdir()为创建一个目录,其他所有父目录必须存在,dir.mkdiers()方法在创建当前目录的同时将多有不存在的父目录一并创建出来**)
  4.**获取一个目录下的部分子项**(获取满足条件的部分子项)**需要用到FileFilter接口及重写其过滤器方法accept()**见demo8

  构造方法
   File file=new File("."+File.separator+"demo.txt"); 
   这里需要注意,构造方法传入的参数是文件的路径,但是这里**尽量不要写绝对路径**,因为不同操作系统之间绝对路径存在着很大的差别(例如:Windows系统有各种盘符(C盘D盘等),而Linux系统只有一个根目录,没由盘符),这就会导致在不同操作系统之间移植的时候,会各种报错,这也就失去了java的优势。所以在写路径时,**尽量去写相对路径而不是绝对路径**,这样就可以保证在不同操作体统间移植的时候不会报错。除了这一点,在写路径时,**尽量不要去写当前系统的分离器**(例如Windows系统路径C:\XAMPP\htdocs,这其中的\就是Windows系统的分离器),不同操作系统之间的分离器也不同,我们在写代码时,**不要写\,而应该写成File.separator**,这是File类的一个成员变量,表示当前系统的分离器。当你移植到不同操作系统时,不同的虚拟机会自动帮你匹配。

这个类的方法有很多
例如:
demo1

        File file=new File("."+File.separator+"demo.txt");

        //获取名字
        String name=file.getName();
        System.out.println("name:"+name);
        //大小(占用的字节量)
        long lenth=file.length();
        System.out.println("大小:"+lenth+"字节");
        //是否为文件
        boolean isFile=file.isFile();
        System.out.println("是文件:"+isFile);
        //是否为目录
        boolean isDir=file.isDirectory();
        System.out.println("是目录:"+isDir);
        //是否问隐藏文件
        boolean isHidden=file.isHidden();
        System.out.println("是否为隐藏文件"+isHidden);
        //最后修改时间
        long time=file.lastModified();

        Date date=new Date(time);
        System.out.println(date);

在当前项目根目录下创建test.txt文件。
demo2

        File file=new File("text.txt");
        /**
         * boolean exists()
         *判断当前File表示的文件或目录是否已经存在了
         */
        if(!file.exists()){
            file.createNewFile();
            System.out.println("创建完毕");
        }

删除当前目录下的test.txt
demo3

        File file=new File("test.txt");
        if(!file.exists()){
            file.delete();
            System.out.println("删除完毕!");
        }else{
            System.out.println("该文件不存在");
        }

在当前目录下创建一个名为demo的目录
demo4

        File dir=new File("demo");
        if(!dir.exists()){
            //创建该目录
            dir.mkdirs();
            System.out.println("创建完毕");
        }else{
            System.out.println("该目录已存在");
        }

在当前目录下创建目录:多级目录 a/b/c/d/e/f
demo5

File dir=new File("a"+File.separator+
                "b"+File.separator+
                "c"+File.separator+
                "d"+File.separator+
                "e"+File.separator+
                "f");
        if(!dir.exists()){
            /**
             * dir.mkdir()方法不能创建多级目录,它只可以创建一个目录,
             * 其他所有父目录必须存在
             *
             * 要创建多级目录就得使用dir.mkdiers()方法
             * 在创建当前目录的同时将多有不存在的父目录一并创建出来。
             */
            dir.mkdirs();
            System.out.println("创建完毕!");
        }else{
            System.out.println("目录已存在");
        }

删除目录
demo6

File dir=new File("demo");
        if(dir.exists()){
            /*
             * 删除目录必有一个要求,该目录必须是一个
             * 空目录才可以将其删除
             * (比如将demo目录改成a目录(因为a目录下还有目录))
             */
            dir.delete();
            System.out.println("删除完毕!");
        }else{
            System.out.println("该目录不存在");
        }

获取当前目录下的所有子项 (是一个list文件集合)
demo7

        File dir=new File(".");
        /*
         * File[] listFiles()
         * 获取当前目录下的所有子项
         */
        File[] subs=dir.listFiles();
        //遍历
        for(File sub:subs){
            if(sub.isFile()){
                System.out.print("文件:");
            }else{
                System.out.print("目录:");
            }
            System.out.println(sub.getName());
        }

获取当前目录下名字以“.”开头的子项(需要用到接口FileFilter的accept过滤器方法(重写))
demo8

        File dir=new File(".");
        /*
         * 重载的listFiles方法会将所有子项都经过一次过滤器
         * 但是该方法只会讲满足过滤器accept方法的子项返回
         */
        File[] subs=dir.listFiles(new MyFilter());
        for(File sub:subs){
            String name=sub.getName();
            System.out.println(name);
        }
        System.out.println("************");
        /*
         * 使用匿名内部类形式创建一个获取当前(目录下的所有文件)的过滤器
         */
        File[] subss=dir.listFiles(new FileFilter(){

            @Override
            public boolean accept(File file) {
                return file.isFile();
            }

        });
        for(File sub:subss){
            System.out.println(sub.getName());
        }

.......


class MyFilter implements FileFilter{

    @Override
    public boolean accept(File file) {
        //过滤条件:名字是以“.”开头
        String name=file.getName();
        System.out.println("正在过滤"+name);
        return name.startsWith(".");
    }

}

目录下面还有多级子目录的删除(使用递归层级删除)
demo9

//删除文件
    public static void f(File dir){//递归
        if(dir.isFile()){//如果是文件直接删除
            System.out.println(dir.getName());
            dir.delete();
        }
        //如果是目录
        File[] dirs=dir.listFiles();
        if(dirs.length==0){//当前目录没有子项直接删除
            System.out.println(dir.getName());
            dir.delete();
        }
        //如果有子项,每个子项递归
        for(File file:dirs){
            f(file);
            System.out.println(dir.getName());
            dir.delete();
        }
    }

    public static void main(String[] args) {
        File dir=new File("a");
        f(dir);
        System.out.println("删除完毕");
    }

以上就是所有对于File的总结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值