Java中的File类,浅谈递归,IO流,字节流

目录

 

File类

1、概述:

2、构造方法:

3、绝对路径和相对路径 :

4、关于获取的方法:

5、关于判断文件文件夹的方法:

6、创建删除文件文件夹的方法:

7、遍历文件夹的方法:

 8、本章小练习

浅谈递归

1、概述:

2、下面是两个案例:实现某个数的阶乘,和通过递归删除一个多级文件夹

1、什么是IO流:

2、IO流的分类

字节流

1、字节

2、输出流的父类

3、输出流子类

 

4、输入流父类

5、输入流子类

换行符:

 

本章小结:复制文件案例

 

字符流


File类

1、概述:

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作

 File表示文件夹或者是文件路径

注意事项:File对象只表示一个路径不表示文件,所以不管文件存不存在,File对象都不会报错

2、构造方法:

方法说明
public File(String pathname)给定路径名称创建File对象
public File(String parent, String child)给定父路径和子路径创建File对象
public File(File parent, String child)给定父路径的File类型和子路径创建File对象

 

  • 1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
  • 2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

代码演示:

    public static void main(String[] args) {
        //public File(String pathname)
        //给定路径名称创建File对象
        File f1 = new File("C:\\Users\\17539\\Desktop\\123.txt");
        //public File(String parent, String child)
        //给定父路径和子路径创建File对象
        File f2 = new File("C:\\Users\\17539\\Desktop","123.txt");
        //public File(File parent, String child)
        //给定父路径的File类型和子路径创建File对象
        File f3 = new File(new File("C:\\Users\\17539\\Desktop"),"123.txt");
    }

3、绝对路径和相对路径 :

绝对路径:就是从盘符开始的路径,例如:C:\aaa\bbb。

相对路径:从项目开始的路径,相对于当前项目的路径,例如项目中有一个模块aaa那么就是例:"aaa\bbb"。

 

4、关于获取的方法:

方法说明
getAbsolutePath()获取绝对路径
getName()获取文件名
length()获取文件大小(不能获取目录的大小)

代码演示:

    public static void main(String[] args) {
        //File的获取方法
        //创建对象
        File f = new File("C:\\Users\\17539\\Desktop\\AAA.java");

        //getAbsolutePath()
        //获取绝对路径
        String s1 = f.getAbsolutePath();
        System.out.println(s1);

        //getName()
        //获取文件或文件夹名
        String name = f.getName();
        System.out.println(name);

        //length()
        //获取文件大小(不能获取文件夹的大小)
        //如果获取文件夹的大小返回的是0或4096这个结果没有意义
        long length = f.length();
        System.out.println(length);
    }

5、关于判断文件文件夹的方法:

方法说明
exists()判断路径是否存在
isFile()判断是否是文件
isDirectory()判断是否是文件夹(目录)

代码演示:

   public static void main(String[] args) {
        File f = new File("lianxi\\123.txt");

        //exists()
        //判断路径是否存在
        System.out.println(f.exists());  //true

        //isFile()
        //判断是否是文件
        System.out.println(f.isFile());  //true

        //isDirectory()
        //判断是否是文件夹
        System.out.println(f.isDirectory()); //false
    }

6、创建删除文件文件夹的方法:

方法说明
createNewFile()创建一个文件
delete()删除一个文件或空文件夹(不能删除有文件的文件夹)
mkdir()创建单层文件夹
mkdirs()创建任意层文件夹

 

代码展示:

    public static void main(String[] args) throws IOException {
        //File创建和删除方法
        File f = new File("C:\\Users\\17539\\Desktop\\abc");

        //createNewFile()
        //创建一个文件
        f.createNewFile();

        //delete()
        //删除一个文件或空文件夹(不能删除有文件的文件夹)
        //注意事项:删除方法会直接删除,不会通过回收站
        f.delete();

        //mkdir()【由于创建任意层文件夹比较方便,这个方法很少使用】
        //创建单层文件夹
        f.mkdir();

        //mkdirs()
        //创建任意层文件夹
        f.mkdirs();
    }

7、遍历文件夹的方法:

方法说明
list()获取目录下所有内容的名称
listFiles()获取目录下所有内容的File对象形式

 

    public static void main(String[] args) {
        //File的遍历文件夹方法

        File f = new File("C:\\Users\\17539\\Desktop\\abc");

        //list()
        //获取目录下所有内容的String名称
        String[] strs = f.list();
        //遍历数组
        for (String str : strs) {
            System.out.println(str);
        }


        //listFiles()
        //获取目录下所有内容的File对象形式
        File[] files = f.listFiles();
        //遍历数组
        for (File file : files) {
            System.out.println(file.getName());
        }
    }

 8、本章小练习

统计文件夹下java文件的个数

如果只需要使用名字就可以使用list(), 如果要调用File的方法就需要使用listFiles()

    public static void main(String[] args) {
        //统计文件夹下java文件的个数
        File f = new File("C:\\Users\\17539\\Desktop\\abc");
        //定义一个计数器
        int count = 0;
        //遍历文件夹
        File[] files = f.listFiles();
        //遍历数组
        for (File file : files) {
            //判断是否是文件 并且是否是.java结尾
            if(file.isFile() && file.getName().endsWith(".java")){
                count++;
            }
        }
        System.out.println("java文件的个数是" + count);
    }

浅谈递归

1、概述:

// 递归就是这种自己调用自己的现象
public static void a(){
a();
}

 

  • 递归就是把大问题变成同类型的小问题去解决。
  • ​在java中递归体现在方法调用自己。
  • ​递归必须要有出口。

2、下面是两个案例:实现某个数的阶乘,和通过递归删除一个多级文件夹

递归实现5的阶乘

    public static void main(String[] args) {
        System.out.println(method(5));
    }

    public static int method(int n) {
        // 等于1则返回1
        if (n == 1) {
            return 1;
        }
        //n的阶乘就是(n-1)的阶乘就等于n的阶乘
        int jie = method(n - 1) * n;
        return jie;
    }

 递归实现删除多级文件夹

    public static void main(String[] args) {
        File f = new File("C:\\Users\\17539\\Desktop\\aaa");
        method(f);
    }

    public static void method(File file){
        // 遍历文件夹
        File[] files = file.listFiles();
        for (File file1 : files) {
            // 判断时文件还是文件夹
            if (file1.isFile()) {
                // 删除
                file1.delete();
            }else{
                // 是文件夹递归
                method(file1);
            }
        }
        // 循环结束后剩下的就是一个空的文件夹
        file.delete();
    }

IO流

1、什么是IO流:

IO流其实就是数据的传输,可以看作数据的流动,根据流动的方向不同,以内存为基准,从内存到硬盘叫做写数据(output)输出,从硬盘到内存叫做读数据(input)输入。

Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。

 

2、IO流的分类

根据数据的流向分为:输入流和输出流。

  • 输入流 :把数据从 其他设备 上读取到 内存 中的流。
  • 输出流 :把数据从 内存 中写出到 其他设备 上的流。


根据数据的类型分为:字节流和字符流。

  • 字节流 :以字节为单位,读写数据的流。
  • 字符流 :以字符为单位,读写数据的流。
顶级的父类们
 输入流输出流
字节流InputStreamOutputStream
字符流ReaderWriter

字节流

1、字节

一切文本数据(视频,图片、文本等),存储时,都是以二进制形式保存的,都是一个个字节,传输的时候也是如此,所以字节流可以传输任何类型的字节数据。

在我们操作流时,要知道无论什么流对象底层传输始终是二进制数据。

2、输出流的父类

父类常用方法
方法说明
close()关闭流资源
write(byte[] b)输出字节数组
write(byte[] b, int off, int len)输出字节数组的一部分。off表示开始索引,len表示个数
write(int b)输出一个字节

3、输出流子类

 注意事项:

  1. 如果文件不存在,输出流会自动创建文件
  2. 如果文件已存在,输出流会覆盖原有文件
  3. 流中的路径只能写文件,不能写文件夹,如果写了文件夹拒绝访问。
  4. 如果在参数加一个true,表示不覆盖原有文件,续写
构造方法
方法说明
public FileOutputStream(File file)向指定文件位置输出数据
public FileOutputStream(String name)向指定字符串路径输出数据
public FileOutputStream(File file,boolean b)创建对象的同时指定是否续写true表示是
public FileOutputStream(String name,boolean b)创建对象的同时指定是否续写true表示是


 

代码演示:

//public FileOutputStream(File file)
//向指定文件位置输出数据
FileOutputStream fis1 = new FileOutputStream(new File("aaa\\123.txt"));

//public FileOutputStream(String name)
//向指定字符串路径输出数据
FileOutputStream fis2 = new FileOutputStream("aaa\\123.txt");

//public FileOutputStream(File file,boolean b)
//创建对象的同时指定是否续写true表示是
FileOutputStream fis1 = new FileOutputStream(new File("aaa\\123.txt"),true);

//public FileOutputStream(String name,boolean b)
//创建对象的同时指定是否续写true表示是
FileOutputStream fis2 = new FileOutputStream("aaa\\123.txt",true);

 

常用方法代码展示:

    public static void main(String[] args) throws IOException {
        //字节输出流的常用方法

        //创建字节输出流对象
        FileOutputStream fis = new FileOutputStream("day10\\123.txt");

        //write(int b)
        //输出一个字节(代码上是数值,文件中是对应的ASCII码)
        fis.write(97);
        fis.write(65);
        fis.write(49);

        //write(byte[] b)
        //输出字节数组
        byte[] arr = {97,98,99,100,101,102};
        fis.write(arr);

        //write(byte[] b, int off, int len)
        //输出字节数组的一部分。off表示开始索引,len表示个数
        //输出数组中从1索引开始的3个字节
        fis.write(arr,1,3);

        //close()
        //关闭流资源,这个方法在我们使用完流最后调用
        fis.close();
    }

4、输入流父类

输入流父类常用方法
方法说明
close()关闭流资源
read()每次读取一个字节,返回值代表的是字节
read(byte[] b)每次读取一个数组的字节,返回值代表读取到的字节个数

5、输入流子类

  • 虽然参数为int类型四个字节,但是只会保留一个字节的信息写出。
  • 流操作完毕后,必须释放系统资源,调用close方法,千万记得。

注意事项:

  1. 输入流如果文件不存在,会报错(系统找不到指定的文件。)
  2. 所有流只能写文件,不能写文件夹,如果写了文件夹(拒绝访问)

 

构造方法
方法说明
FileInputStream(File file)从指定的File文件读取数据
FileInputStream(String name)从指定字符串路径位置读取数据

代码演示:

//FileInputStream(File file)
//从指定的File文件读取数据
FileInputStream fis1 = new FileInputStream(new File("aaa\\123.txt"));

//FileInputStream(String name)*
//从指定字符串路径位置读取数据
FileInputStream fis2 = new FileInputStream("aaa\\123.txt");

常用方法演示:

1、一次读取一个字节:

    public static void main(String[] args) throws IOException {
        //创建对象
        FileInputStream fis = new FileInputStream("aaa\\123.txt");

        //read()
        //每次读取一个字节,返回值代表的是字节
        //每次读取会自动读取后一个字节内容
        //在读取到文件的末尾时,会得到-1,-1代表文件已经结束了
        int i;
        while((i=fis.read()) != -1){
            System.out.println((char)i);
        }

        //close()
        //关闭流资源
        fis.close();
    }

2、一次读取一个字节数组:

  • 使用数组读取,每次读取多个字节,减少了系统间的IO操作次数,从而提高了读写的效率,建议开发中使用。
    public static void main(String[] args) throws IOException {
        //创建对象
        FileInputStream fis = new FileInputStream("aaa\\123.txt");

        //read(byte[] b)
        //每次读取一个数组的字节,返回值表示读取字节的个数
        //如果读到了文件的末尾,返回的是-1
        byte[] bys = new byte[5];
        int len;
        while((len=fis.read(bys)) != -1){
            //0代表从0索引开始,len代表的是读取到了几个就打印几个
            System.out.println(new String(bys,0,len));
        }

        //关闭流资源
        fis.close();
    }

换行符:

回车符 \r 和换行符 \n :

  • 回车符:回到一行的开头(return)。
  • 换行符:下一行(newline)。

系统中的换行:

  • Windows系统里,每行结尾是 回车+换行 ,即 \r\n ;
  • Unix系统里,每行结尾只有 换行 ,即 \n ;
  • Mac系统里,每行结尾是 回车 ,即 \r 。从 Mac OS X开始与Linux统一

 

本章小结:复制文件案例

    public static void main(String[] args) throws IOException {
        //创建输入流
        FileInputStream fis = new FileInputStream("C:\\Users\\17539\\Desktop\\timg.jpg");
        //创建输出流
        FileOutputStream fos = new FileOutputStream("aaa\\b.jpg");

		//方法一:
        //一次读取一个字节
        //int i;
        //while((i=fis.read()) != -1){
        //    //一次输出一个字节
        //    fos.write(i);
        //}

		//方法二:
        byte[] arr = new byte[1024];
        int len;
        //一次读取多个字节
        while((len=fis.read(arr)) != -1){
            //一次写出多个字节
            fos.write(arr,0,len);
        }

        //关闭资源
        fos.close();
        fis.close();
    }

 

字符流

字符流和字节流其方法使用大同小异就不一一列举了。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹈鹕吃吃吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值