JAVA中文件的相关操作

File类的概述

"File所描述的这个路径可以是一个文件夹也可以是一个文件"
"File所描述的这个路径可以存在,也可以不存在"

File 类只能操作文件或者文件夹本身。
但是不能操作文件里面的数据。

3-File类的静态成员变量

如果使用Java来操作windows
路径
    得写成如下的格式:
            C:\\Users\\Administrator\\Desktop\\day09资料
    因为在Java中\表示转义字符的意思。
简单记忆:
    以后在java中写\
    "两个\就表示一个\"
因为\在java中也是有特殊含义的,表示转义字符的含义。

\\
第一个\表示转义字符的意思
第二个\表示被转义了。

整体就是第一个\转义了第二个\原本的含义。把他变成了一个简简单单的\、

关于转义字符的解释。
//我想打印一个双引号。
//因为“ 在java中是有特殊含义的。
//表示字符串的开头或者字符串的结尾。
//会认为下面的三个“
//第一个是字符串的开头
//第二个是字符串的结尾
//第三个又是字符串的开头。那么没有结尾不就报错了吗。
//System.out.println(“”“);
//此时怎么办?
//只能改变中间那个“原来的意思。
System.out.println(“\”“);
//第一个“表示字符串的开头
//第二个\改变了距离他最近的那个字符的含义
//这个字符原本的含义是字符串的开头或者结尾,那么转义之后
//就被改变了,变成了一个简简单单的双引号。
//就不能表示字符串的结尾了

4-绝对路径和相对路径

绝对路径:从盘符开始
          从根目录开始

相对路径:一定是有一个参照物。
            如果你写的是 a.txt 
            那么这个a.txt是相对于当前项目而言的。
            实际存在的位置就是在当前项目下。


aaa\\bbb\\a.txt
        就是在当前项目下的aaa文件夹下的bbb文件夹下的a.txt

"参照物:项目本身"

5-File类的构造方法

public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

代码示例:
    String pathname = "D:\\aaa.txt";
    File file1 = new File(pathname); 

    // 文件路径名
    String pathname2 = "D:\\aaa\\bbb.txt";
    File file2 = new File(pathname2); 

    // 通过父路径和子路径字符串
     String parent = "d:\\aaa";
     String child = "bbb.txt";
     File file3 = new File(parent, child);

    // 通过父级File对象和子路径字符串
    File parentDir = new File("d:\\aaa");
    String child = "bbb.txt";
    File file4 = new File(parentDir, child);

C:\Users\Administrator\Desktop\day09资料\day08.java
文件:
父级路径:C:\Users\Administrator\Desktop\day09资料\
子级路径:day08.java

C:\Users\Administrator\Desktop\day09资料\day07作业答案\demo14
文件夹
父级路径:C:\Users\Administrator\Desktop\day09资料\day07作业答案
子级路径:demo14

6-File类获取功能的方法

//public String getAbsolutePath() :返回此File的绝对路径名字符串。

//public String getPath() :将此File转换为路径名字符串。

public String getName() :返回由此File表示的文件或目录的名称。
如果是文件去调用这个方法。获得是文件名 + 后缀名。
如果是一个文件去调用 。获得是文件夹的名字。

public long length() :返回由此File表示的文件的长度。
如果是一个文件去调用这个方法,获得是这个文件的大小。
如果是一个文件夹去调用这个方法,获得的大小不确定
“严禁使用文件夹去调用。”
如何求一个文件夹的大小呢?
就要把这个文件夹里面所有的文件都加在一起。

7-File类判断功能的方法

public boolean exists() :此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。
public boolean isFile():此File表示的是否为文件。

"以后看一个路径,不能仅仅通过是否有后缀就说这是一个文件还是文件夹。"
文件可以没有后缀。
文件夹可以起一个叫做a.txt的名字。

只能通过isDirectory或者isFile两个方法的判断才能确定这个路径表示的是文件还是文件夹。

8-File类创建删除功能的方法

public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
//只能创建一个文件,即使调用的File路径没有后缀名,创建的也是一个文件。

public boolean delete():删除由此File表示的文件或目录。
//如果删除的是一个文件,那么是不走回收站的。
//如果删除的是一个文件夹,只能删空文件夹。
// 如果有内容,需要进入文件夹,把里面所有的东西全部删除之后,才能删除。

//public boolean mkdir():创建由此File表示的目录。
public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。

//—————————————————————————————————

File 类
“File 用来描述路径的。”
“File 可以表示一个文件也可以表示一个文件夹”
“可以存在也可以不存在”

绝对路径:一定是从盘符开始的。
相对路径:参照物的。
“相对当前项目而言的。”
a.txt //表示着这个a.txt所在的位置就是在当前项目下
aaa\bbb\a.txt 表示着这个在当前项目下的aaa文件夹里面去找。

转义字符:
“在java中两个\表示一个\”

File 类中的一些方法:
1,构造方法。
a,是把一个字符串变成一个File对象。
b,c 拼接

    C:\\aaa\\a.txt

    父级路径:一般会认为是除了自己以外的所有    C:\\aaa

    子级路径:(一般会认为就是自己)a.txt


2.成员方法。
    getName()
        如果是一个文件,那么获得是文件名 + 后缀名
        如果是一个文件夹,那么获得是文件夹的名字
    length()
        如果是一个文件,获得是这个文件的大小
        如果是一个文件夹,不能调用这个方法。

    exists() //判断当前路径是否存在
    isDirectory() //是否为一个文件夹
    isFile()    //是否为一个文件

    File f = new File("C:\\aaa\\a.txt");
        //此时无法断定f表示的就是一个文件的路径。
        //必须要通过isFile的断定才能判断。
    因为在系统中文件夹也可以起名 a.txt
                文件也可以没有后缀名

    "在操作系统中,路径一定要是唯一的"
        举例:
            如果桌面上已经有一个文件夹为 aaa
            那么我们不能再新建一个文件没有后缀名的aaa

    createNewFile() //创建一个文件。且只能创建文件。
                    //必须要保证这个路径的父级路径一定要存在,否则直接报错。

    delete():
                如果是一个文件,那么可以删除,但是不走回收站
                如果是一个文件夹,那么只能删空文件夹,里面有内容哪怕就仅仅是一个其他的空文件夹也不能删除。

    mkdirs();  创建多级文件夹,包括单级也可以。

//—————————————————————————————————
9-File类遍历(文件夹)目录功能

//list

File [] listFile()
            进入到调用者文件夹里面,把这个文件夹里面所有的文件和文件夹的路径都放到一个File类型的数组中返回。

        返回值File[]装的是调用者文件夹里面所有文件和文件夹的路径


    细节:
        1,如果调用者是一个文件夹,那么返回值正常。
        2,如果调用者是一个文件,那么会报错
        3,如果调用者是一个不存在的路径,那么会报错
        4,如果调用者是一个空文件夹,那么会返回一个长度为0的数组。
        5,如果调用者是一个系统权限的文件夹,那么此时也会报错。

10-递归概念&分类&注意事项
递归是算法中的一种
在书写的时候,就是方法在内部调用自己。

    写法:
        如果脱离了IO。我们一般是不写递归的。

        递归大多数情况下都是跟IO相结合的。


        1.不跟IO结合
            a,找出递归什么时候结束。
            b,找出题目要求的规律。

        2.只要会递归跟IO结合的一些练习。
            马上就要碰到。
            我还是会跟多线程一样,给大家总结4步套路。
            所有的,百分之一百, 递归跟IO相结合的都可以使用。

11-练习-使用递归计算1-n之间的和

public class DiGuiDemo {
public static void main(String[] args) {
//计算1~num的和,使用递归完成
int num = 5;
// 调用求和的方法
int sum = getSum(num);
// 输出结果
System.out.println(sum);

}

public static int getSum(int num) {
    if(num == 1){
        return 1;
    }
    return num + getSum(num-1);
}

}

12-练习-使用递归计算阶乘

public class DiGuiDemo {
//计算n的阶乘,使用递归完成
public static void main(String[] args) {
int n = 3;
// 调用求阶乘的方法
int value = getValue(n);
// 输出结果
System.out.println(“阶乘为:”+ value);
}

public static int getValue(int n) {
    if (n == 1) {
        return 1;
    }
    return n * getValue(n - 1);
}

}

13-练习-递归打印多级目录
递归跟IO相结合的问题:

四步:
    1,进入
    2,遍历
    3,判断 --- 判断当前是否是一个文件//处理题目的要求
    4,判断 --- 判断当前是否是一个文件夹 //递归 --- 传递的路径一定要是次一级路径

public class DiGuiDemo2 {
public static void main(String[] args) {
// 创建File对象
File dir = new File(“D:\aaa”);
// 调用打印目录方法
printDir(dir);
}

public static void  printDir(File dir) {
    // 获取子文件和目录
    File[] files = dir.listFiles();
    for (File file : files) {
        // 判断
        if (file.isFile()) {
            // 是文件,输出文件绝对路径
            System.out.println("文件名:"+ file.getAbsolutePath());
        } else {
            // 是目录,输出目录绝对路径
            System.out.println("目录:"+file.getAbsolutePath());
            // 继续遍历,调用printDir,形成递归
            printDir(file);
        }
    }
}

}

14-综合案例-文件搜索

public class DiGuiDemo3 {
public static void main(String[] args) {
// 创建File对象
File dir = new File(“D:\aaa”);
// 调用打印目录方法
printDir(dir);
}
public static void printDir(File dir) {
// 获取子文件和目录
File[] files = dir.listFiles();

    // 循环打印
    for (File file : files) {
        if (file.isFile()) {
            // 是文件,判断文件名并输出文件绝对路径
            if (file.getName().endsWith(".java")) {
                System.out.println("文件名:" + file.getAbsolutePath());
            }
        } else {
            // 是目录,继续遍历,形成递归
            printDir(file);
        }
    }
}

}

15-FileFilter过滤器的原理和使用

public class DiGuiDemo4 {
public static void main(String[] args) {
File dir = new File(“D:\aaa”);
printDir2(dir);
}

public static void printDir2(File dir) {
    // 匿名内部类方式,创建过滤器子类对象
    File[] files = dir.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.getName().endsWith(".java")||pathname.isDirectory();
        }
    });
    // 循环打印
    for (File file : files) {
        if (file.isFile()) {
            System.out.println("文件名:" + file.getAbsolutePath());
        } else {
            printDir2(file);
        }
    }
}

}

规则:
调用者(文件夹)

    把调用者文件夹里面所有的路径拿过来过滤一遍。
    如果满足要求,我就把他放到返回的数组里
    如果不满足要求,我就不放到数组里。

“结论:”
dir.listFiles(); //不传递过滤器,那么就把dir这个文件夹里面所有的文件和文件夹都放到返回的数组里
dir.listFiles(过滤器实现类对象);//如果传递过滤器,那么就把满足要求的文件和文件夹放到返回的数组里

//1,过滤器是干嘛用的?
就是用来过滤文件或者文件夹的。
看他是否满足一定的规则。
如果满足了规则,accept方法就会返回一个true
如果不满足规则,accept方法就会返回一个false

//2,过滤器在哪里用?
过滤器单独出现是没有意义的。
依赖于listFiles方法出现的。

当我们进入一个文件夹的时候(listFiles方法)。
我们可以传递一个过滤器的实现类对象。

16-FileNameFilter过滤器的使用和Lambda优化程序
//了解一下。

public static void printDir3(File dir) {
// lambda的改写
File[] files = dir.listFiles(f ->{
return f.getName().endsWith(“.java”) || f.isDirectory();
});

// 循环打印
for (File file : files) {
    if (file.isFile()) {
        System.out.println("文件名:" + file.getAbsolutePath());
    } else {
        printDir3(file);
    }
}

}
//————————————————————————————
//dir : C:\aaa
public static void printDir2(File dir) {
// 匿名内部类方式,创建过滤器子类对象
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) { // C:\aaa\a.txt
return pathname.getName().endsWith(“.java”)||pathname.isDirectory();
}
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println(“文件名:” + file.getAbsolutePath());
} else {
printDir2(file);
}
}
}
//针对于第一种过滤器来讲 accpet方法中只有一个参数。这个参数表示什么?
依次表示调用者文件夹里面的每一个文件或者文件夹的路径。

//————————————————————————————-

public static void printDir3(File dir) {
// lambda的改写
//dir : C:\aaa
File[] files = dir.listFiles(new FileNameFilter(){
@Override
public boolean accept(File d, String name){//d 也是C:\aaa name a.txt
return f.getName().endsWith(“.java”) || f.isDirectory();
}
});

// 循环打印
for (File file : files) {
    if (file.isFile()) {
        System.out.println("文件名:" + file.getAbsolutePath());
    } else {
        printDir3(file);
    }
}

}

//针对于第二种过滤器来讲
是有两个参数。
第一个参数:实际上就是调用者路径 dir
第二个参数:调用者文件夹里面的 文件夹名 和 文件名。

//——————————
综上所述:
第二种过滤器两个参数如果拼接在一起。
那么就是第一种过滤器的参数。

如果是第一种过滤器:
    .getName 就可以得到第二种过滤器的第二个参数。


 File[] files = dir.listFiles(new FileNameFilter(){
    @Override
        public boolean accept(File d, String name){//d 也是C:\\aaa  name  a.txt
            return f.getName().endsWith(".java") || f.isDirectory(); 
        }
});





File[] files = dir.listFiles(
    (File d, String name)->{
        return f.getName().endsWith(".java") || f.isDirectory(); 
    }
);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值