第十三周笔记

1. File类

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

  • java把电脑中的文件和文件夹(目录)封装为了一个File类,我们可以使用File类对文件和文件夹进行操作。

  • File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法。

file:文件
directory:文件夹/目录
path:路径

1.1 File类的静态成员变量

static String pathSeparator: 与系统有关的路径分隔符,为了方便,它被表示为一个字符串;
static char pathSeparatorChar: 与系统有关的路径分隔符。

static String separator: 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串;
static char separatorChar: 与系统有关的默认名称分隔符。

public class Demo01File {
    public static void main(String[] args) {
        String pathSeparator = File.pathSeparator;
        System.out.println(pathSeparator);  //路径分隔符 Windows:分号; Linux:冒号:

        String separator = File.separator;
        System.out.println(separator);     //文件名称分隔符 Windows:反斜杠\ Linux:正斜杠/
    }
}

操作路径: 路径不能写死了。
Windows:C:\develop\a\a.txt
Linux:C:/develop/a/a.txt
通用:“C:” + File.separator + “develop” + File.separator + “a” + File.separator + “a.txt”

1.2 绝对路径和相对路径

绝对路径: 一个完整的路径,以盘符开始的路径。
相对路径: 一个简化的路径,相对指的是相对于当前项目的根目录,如果使用当前项目的根目录,就可以简化书写。

注意:

  1. 路径不区分大小;
  2. 路径中的文件名称分隔符Windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠。

1.3 File类的构造方法

  1. File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。
    参数String pathname: 字符串的路径名称,路径可以是以文件结尾,也可以是以文件夹结尾,路径可以是相对路径,也可以是绝对路径,路径可以是存在的,也可以是不存在的,创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况。
  2. File(String parent, String child) 根据parent路径名和child路径名创建一个新File实例。
    参数: String parent,:父路径 String child:子路径
    好处: 父路径和子路径,可以单独书写,使用起来非常灵活。
  3. File(File parent, String child) 根据parent抽象路径名和child路径名创建一个新File实例。
    参数: File parent,:父路径 String child:子路径
    好处: 父路径和子路径,可以单独书写,使用起来非常灵活。父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象。
public class Demo02File {
    public static void main(String[] args) {
        demo1();
        demo2("D:\\", "week13");
        demo3();
    }
    public static void demo1(){
        File f1 = new File("D:\\wenjian\\Project01\\src\\week13");
        System.out.println(f1);  //重写了Object类的toString方法,D:\wenjian\Project01\src\week13
    }
    public static void demo2(String parent, String child){
        File f1 = new File(parent, child);
        System.out.println(f1);  //D:\week13
    }
    public static void demo3(){
        File parent = new File("D:\\");
        File f = new File(parent, "week13");
        System.out.println(f); //D:\week13
    }
}

1.4 File类获取功能的方法

  • public String getAbsolutePath():返回此File的绝对路径名字符串;
  • public String getPath():将此File转换为路径名字符串;
  • public String getName():返回由此File表示的文件或目录的名称;
  • public long length():返回由此File表示的文件的长度(指定文件的大小,以字节为单位)。
public class Demo03File {
    public static void main(String[] args) {
        demo1();
        demo2();
        demo3();
        demo4();
    }

    public static void demo1(){
        File f1 = new File("D:\\wenjian\\Project01\\src\\week13");
        String s1 = f1.getAbsolutePath();
        System.out.println(s1);  //D:\wenjian\Project01\src\week13

        File f2 = new File("week13");
        String s2 = f2.getAbsolutePath();
        System.out.println(s2);  //D:\wenjian\Project01\week13
    }

    public static void demo2(){
        File f1 = new File("D:\\wenjian\\Project01\\src\\week13");
        String s1 = f1.getPath();
        System.out.println(s1);  //D:\wenjian\Project01\src\week13

        File f2 = new File("week13");
        String s2 = f2.getPath();
        System.out.println(s2);  //week13
    }

    public static void demo3(){
        File f1 = new File("D:\\wenjian\\Project01\\src\\week13");
        String s1 = f1.getName();
        System.out.println(s1);  //week13

        File f2 = new File("D:\\wenjian\\Project01\\src");
        String s2 = f2.getName();
        System.out.println(s2);  //src
    }

    public static void demo4(){
        File f = new File("D:\\wenjian\\Project01\\src\\week13\\Demo01File.java");
        long l = f.length();
        /*
        注意:
        文件夹是没有大小概念的,不能获取文件夹的大小
        如果构造方法中给出的路径不存在,则返回0
         */
        System.out.println(l);  //433
    }
}

1.5 File类判断功能的方法

  • public boolean exists(): 判断此File表示的文件或目录是否实际存在;
  • public boolean isDirectory(): 判断此File表示的是否为目录,即判断构造方法中给定的路径是否以文件夹结尾;
  • public boolean isFile(): 判断此File表示的是否为文件,即判断构造方法中给定的路径是否以文件结尾。
public class Demo04File {
    public static void main(String[] args) {
        File f1 = new File("D:\\wenjian\\Project01\\src\\week13");
        System.out.println(f1.exists());  //true
        System.out.println(f1.isDirectory());  //true
        //这两个方法的结果互斥,如果路径不存在则都为false
        System.out.println(f1.isFile());  //false
    }
}

1.6 File类类创建删除功能的方法

  • public boolean createNewFile() 当且仅当具有该名称的文件不存在时,创建一个新的空文件,此方法只能创建文件,不能创建文件夹,创建文件的目录必须存在,否则会抛出异常;
  • public boolean delete() 删除由此File表示的文件或文件夹,如果文件夹中有内容,则不会删除,直接从硬盘中删除,不走回收站;
  • public boolean mkdir() 创建由此File表示的文件夹,只能创建单级文件夹,创建文件夹的目录必须存在,否则会抛出异常;
  • public boolean mkdirs() 创建由此File表示的文件夹,可以创建多级文件夹,创建文件夹的目录必须存在,否则会抛出异常。

1.7 File类遍历目录功能

  • public String[] list(): 返回一个String数组,表示该File目录中所有的子文件或目录;
  • public File[] listFiles(): 返回一个File数组,表示该File目录中的所有的子文件或目录。

注意:

  1. list和listFiles方法遍历的是构造方法中给出的目录;
  2. 如果构造方法中给出的目录的路径不存在,会抛出空指针异常;
  3. 如果构造方法中给出的路径不是一个目录,也会抛出空指针异常。
public class Demo05File {
    public static void main(String[] args) {
        File f1 = new File("D:\\wenjian\\Project01\\src\\week13");
        String[] arr = f1.list();
        for (String fileName: arr) {
            System.out.println(fileName);  //打印的是文件名/目录名
        }

        File[] file = f1.listFiles();
        for (File fileName: file) {
            System.out.println(fileName);  //打印的是文件名/目录名的路径
        }
    }
}

1.8 练习—文件搜索

练习:遍历D:\wenjian\Project01\src文件夹,及src文件夹的子文件夹,只要.java结尾的文件

public class FilePractice {
    public static void main(String[] args) {
        File file = new File("D:\\wenjian\\Project01\\src");
        getAllFile(file);
    }
    public static void getAllFile(File file) {
        System.out.println(file);
        File[] files = file.listFiles();
        for (File f: files) {
            if(f.isDirectory()){
                getAllFile(f);
            } else {
                //只要.java结尾的文件
                String s = f.getName();
                Boolean b = s.endsWith(".java");
                if(b) {
                    System.out.println(f);
                }
            }
        }
    }
}

1.9 FileFilter过滤器的原理和使用

我们可以使用过滤器来实现上个练习

File[] listfiles(FileFilter filter)
java.io.FileFilter接口: 用于抽象路径名(File对象)的过滤器;
作用: 用来过滤文件;
方法: boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中;参数File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象。

File[] listfiles(FilenameFilter filter)
java.io.FilenameFilter接口: 实现此接口的类实例可用于过滤器文件名;
作用: 用来过滤文件名称;
方法: boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中;参数File dir:构造方法中传递的被遍历的目录, String name:使用ListFiles方法遍历目录,得到的每一个文件/文件夹名称。

注意: 两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中定义自己过滤的规则。

public class FileFilterImpl implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        if(pathname.isDirectory()){
            return true;
        }
        return pathname.getName().endsWith(".java");
    }
}
public class FilePractice {
    public static void main(String[] args) {
        File file = new File("D:\\wenjian\\Project01\\src");
        getAllFile(file);
    }
    public static void getAllFile(File file) {
        System.out.println(file);
        File[] files = file.listFiles(new FileFilterImpl());
        for (File f: files) {
            if(f.isDirectory()){
                getAllFile(f);
            } else {
                System.out.println(f);
            }
        }
    }
}

在这里插入图片描述

1.10 FileNameFilter过滤器的使用和Lambda的优化程序

public class FilePractice {
    public static void main(String[] args) {
        File file = new File("D:\\wenjian\\Project01\\src");
        getAllFile(file);
    }
    public static void getAllFile(File file) {
        System.out.println(file);
        /*
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".java") || pathname.isDirectory();
            }
        });
        //使用Lambda表达式
        File[] files = file.listFiles((pathname) -> pathname.getName().endsWith(".java") || pathname.isDirectory());
        */
        /*
        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isDirectory() || name.endsWith(".java");
            }
        });
        */
        //使用Lambda表达式
        File[] files = file.listFiles((dir,name) -> new File(dir,name).isDirectory() || name.endsWith(".java"));
        for (File f: files) {
            if(f.isDirectory()){
                getAllFile(f);
            } else {
                System.out.println(f);
            }
        }
    }
}

2. IO概述

在这里插入图片描述

输入流输出流
字节流InputStreamOutputStream
字符流ReaderWriter

一切皆为字节: 一切文件数据在存储时,都是以二进制数字的形式保存,都是一个一个的字节,那么传输一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

2.1 OutputStream类&FileOutputStream类

java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地,它定义了字节输出流的基本功性功能方法。

  • public void close(): 关闭此输出流并释放与此流相关联的任何系统资源;
  • public void flush(): 刷新此输出流并强制任何缓冲的输出字节被写出;
  • public void write(byte[] b): 将b.length字节从指定的字节数组写入此输出流;
  • public void write(byte[] b, int off, int len): 从指定的字节数组写入len字节,从偏移量off开始输出到此输出流;
  • public abstract void write(int b): 将指定的字节输出流。

java.io.FileOutPutStream extends OutputStream

FileOutPutStream: 文件字节输出流。

作用: 把内存中的数据写入到硬盘的文件中。

构造方法:

  • FileOutPutStream(String name) 创建一个向具有指定名称的文件写入数据的输出文件流;
  • FileOutPutStream(File file) 创建一个向指定File对象表示的文件写入数据的文件输出流。

参数: String name:目的地是一个文件的路径, File file:目的地是一个文件

2.2 字节输出流写入数据到文件

写入数据的原理: (内存->硬盘)
java程序->JVM->OS(操作系统)->OS调用写数据的方法->把数据写入文件中

public class DemoOutPutStream {
    public static void main(String[] args) throws IOException {
        //1. 创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("D:\\wenjian\\a.txt");
        //2. 把数据写入文本中
        fos.write(10);
        //3. 释放资源
        fos.close();
    }
}

字节存储的原理和记事本打开文件的原理
在这里插入图片描述

2.3 字节输出流写多个字节的方法

一次写多个字节的方法:

  • public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流;
    一次写多个字节,如果第一个字节是正数(0-127),那么显示的时候会查询ASCII表,如果写的第一个字节是负数,那么第一个字节和第二个字节,两个字节组成一个中文显示,查询系统默认码表(GBK)
  • public void write(byte[] b, int off, int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流
    int off:数组的开始所以
    int len:写几个字节
public class DemoOutPutStream {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("D:\\wenjian\\a.txt");
        /*
        //byte[] bytes = {65, 66, 67, 68}; //ABCD
        byte[] bytes = {-65, 66, 67, 68};  //緽CD
        fos.write(bytes);
        //fos.write(bytes, 1, 2);  //BC
        fos.close();
        */
        
		/*
		写入字符的方法:可以使用String类中的方法,把字符串转换为字节数组
		byte[] getBytes() 把字符串转换成字节数组
		*/
		byte[] bytes2 = "你好".getBytes();
        fos.write(bytes2);
        fos.close();
    }
}

2.4 InputStream类&FileInputStream类

java.io.InputStream:字节输入流,此抽象类是表示字节输入流的所有类的超类,定义了所有子类共性的方法。

  • public abstract int read(): 从输入流中读取数据的下一个字节;
  • public int read(byte[] b): 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中;
  • public void close(): 关闭此输入流并释放与此相关联的所有系统资源。

java.io.FileInputStream extends InputStream

FileInputStream: 文件字节输入流;
作用: 把硬盘文件中的数据,读取到内存中使用;
构造方法:

  • FileInputStream(String name),String name:文件的路径;
  • FileInputStream(File file),File file:文件。
public class DemoInputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\wenjian\\a.txt");
        int len = fis.read();
        System.out.println(len);  //65 A
        len = fis.read();
        System.out.println(len);  //66 B
        len = fis.read();
        System.out.println(len);  //67 C
        //读到文件的末尾返回-1
        fis.close();
    }
}

字节输入流一次读取一个字节的原理
在这里插入图片描述
字节输入流一次读取多个字节的原理

  • public int read(byte[] b):从输入流中读取一定数量的字节,将其存储在缓存区数组b中
  1. 方法的参数byte[]的作用?
    起到缓冲作用,存储每次读取的多个字节,数组的长度一般定义为1024(1kb)或者1024的整数倍。
  2. 方法的返回值int是什么?
    每次读取的有效字节个数。
public class DemoInputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\wenjian\\a.txt");
        /*
        byte[] b = new byte[3];
        int len = fis.read(b);
        System.out.println(len);  //3
        System.out.println(Arrays.toString(b));  //[65, 66, 67]
        System.out.println(new String(b)); //ABC
        fis.close();
        */
		byte[] bytes = new byte[1024];
		int lens = 0;
		while((lens = fis.read(bytes)) != -1){
			System.out.println(new String(bytes, 0, lens));
		}
		fis.close();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的海滨体育馆管理系统,源码+数据库+毕业论文+视频演示 本基于Spring Boot的海滨体育馆管理系统设计目标是实现海滨体育馆的信息化管理,提高管理效率,使得海滨体育馆管理工作规范化、高效化。 本文重点阐述了海滨体育馆管理系统的开发过程,以实际运用为开发背景,基于Spring Boot框架,运用了Java技术和MySQL作为系统数据库进行开发,充分保证系统的安全性和稳定性。本系统界面良好,操作简单方便,通过系统概述、系统分析、系统设计、数据库设计、系统测试这几个部分,详细的说明了系统的开发过程,最后并对整个开发过程进行了总结,实现了海滨体育馆相关信息管理的重要功能。 本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高海滨体育馆管理效率。 关键词:海滨体育馆管理,Java技术,MySQL数据库,Spring Boot框架 本基于Spring Boot的海滨体育馆管理系统主要实现了管理员功能模块和学生功能模块两大部分,这两大功能模块分别实现的功能如下: (1)管理员功能模块 管理员登录后可对系统进行全面管理操作,包括个人中心、学生管理、器材管理、器材借出管理、器材归还管理、器材分类管理、校队签到管理、进入登记管理、离开登记管理、活动预约管理、灯光保修管理、体育论坛以及系统管理。 (2)学生功能模块 学生在系统前台可查看系统信息,包括首页、器材、体育论坛以及体育资讯等,没有账号的学生可进行注册操作,注册登录后主要功能模块包括个人中心、器材管理、器材借出管理、器材归还管理、校队签到管理、进入登记管理、离开登记管理、活动预约管理。
毕业设计,基于SpringBoot+Vue+MySQL开发的学科竞赛管理系统,源码+数据库+毕业论文+视频演示 随着国家教育体制的改革,全国各地举办的竞赛活动数目也是逐年增加,面对如此大的数目的竞赛信息,传统竞赛管理方式已经无法满足需求,为了提高效率,竞赛管理系统应运而生。 本学科竞赛管理系统以实际运用为开发背景,基于Spring Boot框架、Vue框架,运用了Java语言和MySQL数据库进行开发设计,充分保证系统的安全性和稳定性。本系统界面良好,操作简单方便,通过系统概述、系统分析、系统设计、数据库设计、系统测试这几个部分,详细的说明了系统的开发过程,最后并对整个开发过程进行了总结,实现了学科竞赛管理的重要功能。 本学科竞赛管理系统运行效果稳定,操作方便、快捷,界面友好,是一个功能全面、实用性好、安全性高,并具有良好的可扩展性、可维护性的学科竞赛管理平台。 关键词:学科竞赛管理,Java语言,MySQL数据库,Vue框架 此学科竞赛管理系统的设计与实现功能分析主要分为管理员功能模块和学生功能模块两大模块,下面详细介绍这两大模块的主要功能: (1)管理员:管理员登陆后可对系统进行全面管理,管理员主要功能模块包括个人中心、学生管理、教师管理、赛项信息管理、赛项报名管理、奖项统计管理、管理员管理以及系统管理,管理员实现了对系统信息的查看、添加、修改和删除的功能。 (2)学生:学生进入本学科竞赛管理系统的设计与实现前台可查看系统信息,包括首页、赛项信息以及新闻资讯等,注册登录后主要功能模块包括个人中心和赛项报名管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值