Java基础_18File类【重点】_递归_IO流【重点】

回顾昨天内容
1.TreeSet
	底层是二叉树
	会对咱们的存储的数据进行排序   从小到大排列
	
	存Integer,  String   
	存Perosn对象
	会报错的。Person类不具备排序的功能
	实现Comparable接口,重写comparaTo
2.匿名内部类
	interface A {
		void test();
	}
	main {
		new A () {
			public void test () {
				sout("嘻嘻");
			}
		}.test();
	}
4.HashMap
	方法
	

今天的内容

1.File类【重点】

2.递归

3.IO流【重点】

1.File类

File类sun公司封装好的一个类,专门处理磁盘的文件和文件夹的类

咱们在windows系统上面。可以通过右键新建一个文件或者文件夹。还可以删除文件或者文件夹

也可以通过Java代码删除文件和文件夹。依靠File类。

路径问题:

​ 1.相对路径

​ 得有参照物

​ 我坐在张三的前面

​ ./当前的工作目录 ./是可以省略

​ …/上一级目录

​ …/…/上两级目录

​ 2.绝对路径

​ 从磁盘的根目录 直到找到咱们资源

​ C:\aaa\1.txt

想学一个类File类

1.打开官方的API
2.搜File
3.看这个类是干嘛的
4.看构造方法
5.看方法
File(String pathname)

通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

package com.qf.a_file;

import java.io.File;

public class Demo1 {
    public static void main(String[] args) {
        File file = new File("c:/aaa/1.txt");//分隔符  /
        File file1 = new File("c:\\aaa\\1.txt");//分割符\\
        System.out.println(file);
        System.out.println(file1);
        //在windows系统中 使用的是  \  和/都是可以的
        //在Linux系统 必须是/
        //static String	separator
        //与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。
        System.out.println(File.separator);
        //如果是windows系统就是\    如果是linux 系统 变成/
        File file2 = new File("c:" + File.separator + "aaa" + File.separator + "1.txt");
        System.out.println(file2);
        //将/换成了File.separator
    }
}

1.1File类的方法

boolean createNewFile();创建一个新的文件

​ 1.文件存在的时候,创建的时候返回值是false

​ 2.当路径不存在呢?会有异常系统找不到指定的路径。

​ 3.磁盘坏了不能进行读写的操作,也是不行!!!

boolean mkdir();创建单级目录

boolean mkdirs();创建多级目录

package com.qf.a_file;

import java.io.File;
import java.io.IOException;


public class Demo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("c:/aaa/xixi.txt");
        System.out.println(file.createNewFile());
        File file1 = new File("c:/aaa/bbb");
        System.out.println(file1.mkdir());
        File file2 = new File("c:/aaa/fff/ddd/uuu");
        System.out.println(file2.mkdir());
        System.out.println(file2.mkdirs());

    }
}

删除文件和文件夹

boolean delete(); 删除文件夹或者文件

package com.qf.a_file;

import java.io.File;


public class Demo3 {
    public static void main(String[] args) {
        File file = new File("c:/aaa/xixi.txt");
        //当删除一个不存在的文件的时候返回值是false
        System.out.println(file.delete());
        //删除文件夹的
        File file1 = new File("c:/aaa/bbb");
        File file2 = new File("c:/aaa/fff");
        System.out.println(file1.delete());//true
        //只能删除空的文件夹
        System.out.println(file2.delete());//false


    }
}

File对象的判断方法【开发中经常用的】

boolean isFile();判断是否是文件

boolean isDireactory(); 是否是文件夹

boolean isHidden();是否是隐藏文件【开发中不常用】

boolean isAbsolute(); 是否是绝对路径

boolean exists(); 判断文件或者文件夹是否存在

package com.qf.a_file;

import java.io.File;
import java.io.IOException;


public class Demo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("c:/aaa/1.txt");
        //当文件存在的时候,才能判断是否是文件
        System.out.println(file.isFile());
        File file1 = new File("c:/aaa");
        System.out.println(file1.isFile());//false  不是文件

        System.out.println(file1.isDirectory());//true
        System.out.println(file.isHidden());//false
        System.out.println(file.isAbsolute());
        System.out.println(file.exists());//true
        
        if (!file.exists()) {//不存在才创建
            file.createNewFile();
        }
    }
}

返回值是String类型的File类的方法

String getName(); 获取文件夹或者文件的名字

String getPath();获取路径

String getParent();获取当前对象的父级目录

package com.qf.a_file;

import java.io.File;


public class Demo5 {
    public static void main(String[] args) {
        File file = new File("c:/aaa/1.txt");
        System.out.println(file.getName());//1.txt

        File file2 = new File("c:/aaa");
        System.out.println(file2.getPath());//c:\aaa
        System.out.println(file2.getParent());//c:\
        

    }
}

返回值是long类型的数据

long length();获取文件占用的额字节数

long lastModified(); 获取最后一次修改的时间

package com.qf.a_file;

import java.io.File;


public class Demo6 {
    public static void main(String[] args) {
        File file = new File("c:/aaa/1.txt");
        System.out.println(file.length());

        System.out.println(file.lastModified());//1686800418402
    }
}

File[] listFiles(); 获取当前文件夹下面所有的文件和文件夹的对象,返回值是File数组

String[] list();获取当前文件夹下面所有的文件和文件夹的字符串

package com.qf.a_file;

import java.io.File;


public class Demo6 {
    public static void main(String[] args) {
        File file = new File("c:/aaa/1.txt");
        System.out.println(file.length());

        System.out.println(file.lastModified());//1686800418402

        File file1 = new File("c:/");
        System.out.println(file1.listFiles());
        File[] files = file1.listFiles();
        for (File file2 : files) {
            System.out.println(file2);//是file对象
        }
        System.out.println("=====");
        String[] list = file1.list();
        for (String s : list) {
            System.out.println(s);
        }
    }
}

上午回顾

1.创建File对象
2.File类下面方法

2.递归

见递归文档

案例:

//遍历磁盘中的所有目录及子目录中的所有文件
1.
	file = "c:/ccc"
	遍历:
		file1 = 2.gif   是文件
		打印了2.gif
		file1 = 2.txt 是文件
		打印2.txt
		file1 = c:/ccc/ddd  是文件夹
		
	findFile(File file) file = "c:/ccc/ddd"
	遍历:
			file1 = 1.png
			file1 = eee  文件夹
			
	findFile(File file) file = "c:/ccc/ddd/eee"

		file1 = sb.txt
package com.qf.b_digui;

import java.io.File;


public class Demo3 {
    public static void main(String[] args) {
        //遍历磁盘中的所有目录及子目录中的所有文件
        findFile(new File("c:/ccc"));
    }
    public static void findFile (File file) {
        //当前目录下面所有的文件及文件夹
        File[] files = file.listFiles();
        for (File file1 : files) {
           if (file1.isFile()) {//是文件的话打印文件的名字
               System.out.println(file1.getName());
           } else {//如果是文件夹呢?
               //使用递归
               findFile(file1);
           }
        }
    }
}

案例:

删除一个目录下面的所有的文件及其子目录下面的文件

注意事项: 不要乱删!!!

package com.qf.b_digui;

import java.io.File;


public class Demo4 {
    public static void main(String[] args) {
        delFile(new File("c:/ccc"));
    }
    //删除一个目录下面的所有的文件及其子目录下面的文件
    public static void delFile(File file) {
        File[] files = file.listFiles();
        for (File file1 : files) {
            if (file1.isDirectory()) {
                delFile(file1);
            } else {
                file1.delete();
            }
        }
    }
}

3.IO流【重点】

现在学会创建文件 删除文件。但是文件中内容能读取出来?只能借助于IO流操作,读取文件,图片,音频,视频等文件。

咱们电脑上面所有的文件(文本,图片,音频,视频)等都是可以进行读和写的!!!

以流的形式来读写的!!!

3.1缓冲的概念

Io流在进行文件读和写的时候,其实是一字节一字节进行读和写的。但是可以加

一个缓冲流,每次读取4KB 。

3.2IO流

I:

​ input: 输入流 从磁盘的某一个文件中读取数据到内存(Java代码)

O:

​ output: 输出流 从内存(String str = “狗蛋”) 写入咱们磁盘中 某一个文档文本中

参照物:

​ 是内存

​ 磁盘->内存 输入

​ 内存->磁盘 输出

3.2.1输入流

1.字节输入流

2.字符输入流

1.字节输入流

Java中给咱们封装好的一个, FileInputStream

案例: 从磁盘的C:/aaa/1.txt文件 将数据读取到Java代码中赋值给一个变量。

FileInputStream(File file)

通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。

入门案例

package com.qf.c_input;

import java.io.*;


public class Demo1 {
    public static void main(String[] args) throws IOException {
        //场景:  从磁盘的C:/aaa/1.txt文件  将数据读取到Java代码中赋值给一个变量。
        //1.创建File对象, 就是数据源
        File file = new File("c:/aaa/1.txt");
        //2.创建字节输入流对象,操作数据源对象
        FileInputStream fis = new FileInputStream(file);
        //3.FileInputStream  流对象本身不具备缓冲功能!!!
        //A BufferedInputStream为另一个输入流添加了功能,即缓冲输入
        BufferedInputStream bis = new BufferedInputStream(fis);
        //4.走到这一步,字节输入流就具备缓冲功能了
        //当创建BufferedInputStream时,将创建一个内部缓冲区数组。
        byte[] buf = new byte[3];//缓冲数组。现在是空的数组
        System.out.println("Line24:"+new String(buf));
        //每次需要从1.txt文件中读取3个字节 到 空的数组中
        //为啥是字节数组,因为字节流
        //5.开始从1.txt文件中 去读取数据放到数组中
        //从输入流读取一些字节数,并将它们存储到缓冲区b
        int read = bis.read(buf);
        //读取到缓冲区的总字节数,或者如果没有更多的数据,因为已经到达流的末尾,则是 -1 。
        System.out.println(read);//3
        //缓冲数组中数据 咋看?
        System.out.println("Line33:"+new String(buf, 0, read));//abc
        int read1 = bis.read(buf);
        System.out.println(read1);//1
        System.out.println("Line35:"+new String(buf, 0, read1));//dbc
        //第一次的时候:  [a, b, c]
        //第二次的时候: [d, b, c]

        //6.关闭流
        bis.close();
        fis.close();

    }
}

package com.qf.c_input;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;


public class Demo2 {
    public static void main(String[] args) throws Exception{
        //你得告诉我你要读取的是磁盘上面那个文件   数据源
        File file = new File("c:/aaa/1.txt");
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis);
        byte[] buf = new byte[3];//一次可以存3字节[0,0,0]
//        int read = bis.read(buf);
        //返回值读取到缓冲区的总字节数,或者如果没有更多的数据,因为已经到达流的末尾,则是 -1
        int length;
        while ((length = bis.read(buf)) != -1) {
            System.out.println(length);
            System.out.println("xixi");
            System.out.println(new String(buf,0 , length));
        }
        //关闭流
        bis.close();
        fis.close();


    }
}

练习:

作业一.一定将字节输入流每行代码理解吃透!!!拿着官方手册还有笔记注释一点一点的理解
如果今天能弄懂这个,那么明天讲课就要起飞


练习二:
练习一:相对路径和绝对路径的使用

描述:创建两个文件对象,分别使用相对路径和绝对路径创建。
答案
操作步骤:
绝对路径创建文件对象:使用File类一个参数的构造方法。
相对路径创建文件对象:使用File类两个参数的构造方法。

练习二:检查文件是否存在,文件的创建

描述:检查D盘下是否存在文件a.txt,如果不存在则创建该文件。
答案
操作步骤:
1.使用绝对路径创建对象关联到D盘的a.txt。
2.通过文件对象方法判断文件是否存在。
3.不存在则调用创建文件的方法创建文件。

练习三:文件夹的获取方法

描述:
获取指定文件夹下所有的文件,并将所有文件的名字输出到控制台。
注意:不包含子文件夹下的文件
答案
操作步骤:
1.创建文件对象关联到指定文件夹,比如:c:/aaa
2.调用文件对象的listFiles方法获得文件数组
3.遍历文件数组将每一个文件的名字输出到控制台


练习四:   
	一个文件夹下(文件夹地址:C:\Users\bowang\eclipse-workspace)有多个java文件
练习五: 
	编写一个程序,在命令行中以树状结构展现特定的文件夹及其子文件(夹)
	例如:   C:/aaa/bbb/1.txt    C:/aaa/ccc/2.txt   C:/aaa/3.txt
	C:/
		aaa
			bbb
				1.txt
			ccc  
				2.txt
			3.txt


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值