您的位置:首页 > 编程语言 > Java开发

Java-进阶-day08-IO流_01

2020-01-12 13:23 197 查看

Java进阶-day08-IO流_01

今日内容

  • File类
  • 递归

一.File类

####.File类的概述和作用

  • 什么是File类

File类是文件或者是目录(文件夹)的路径名抽象表现形式

我们只需要把字符串的路径封装成一个File类,至于这个路径到底存在不存在,File不知道
只能通过调用File类中的方法进行判断才能知道File类的路径是否是存在的

File类的构造方法 File类的常用构造方法

  • File(String pathname)【重点掌握】 :将一个字符串路径封装成File对象
  • File(String parent,String child) :传入一个父级路径和子级路径
  • File(File parent,String child)【重点掌握】 :传入一个File类型的父级路径和子级路径
  • 案例代码:
public class FileDemo01 {
public static void main(String[] args) {
File file = new File("D:\\test\\day07_作业.wmv");
// File file = new File("D:/test/day07_作业.wmv");
System.out.println(file);

File f1 = new File("D:\\test","day07_作业.wmv");
System.out.println(f1);

File srcFile = new File("D:\\test");
File f2 = new File(srcFile, "day07_作业.wmv");
System.out.println(f2);
}
}

File类之创建功能

  • boolean createNewFile()【重点掌握】 :指定路径不存在该文件时时创建文件,返回true,否则返回false
  • boolean mkdir() :当指定的单级文件夹不存在时创建文件夹并返回true,否则返回false
  • boolean mkdirs()【重点掌握】 :当指定的多级文件夹某一级文件夹不存在时,创建多级文件夹并返回true,否则返回false
  • 案例演示:
public class FileDemo02 {
public static void main(String[] args) throws IOException {
File f0 = new File("D:\\test\\abc.java");
boolean flag = f0.createNewFile();
System.out.println(flag);

File f1 = new File("D:\\test\\itheima");
boolean flag1 = f1.mkdir();
System.out.println(flag1);

File f2 = new File("D:\\test\\a\\b\\c");
System.out.println(f2.mkdirs());
}
}

File类的判断功能

  • boolean exists()【重点掌握】 : 判断指定路径的文件或文件夹是否存在
  • boolean isDirectory()【重点掌握】: 判断当前的目录是否存在
  • boolean isFile()【重点掌握】 : 判断当前路径是否是一个文件

File类之常用的获取方法

  • public String getAbsolutePath() : 返回此File的绝对路径名字符串。
  • public String getPath() : 返回构造方法中封装的路径字符串
  • public String getName()【重点掌握】 : 获取的是文件或目录的名称。
  • String[] list() : 以字符串数组的形式返回当前路径下所有的文件和文件夹的名称
  • File[] listFiles()【重点掌握】 : 获取当前路径下所有的文件和文件夹,并将每一个文件或目录封装成File对象,并存入到File数组中

File类删除功能

  • public boolean delete() : 删除由此抽象路径名表示的文件或目录
  • 案例演示:
public class FileDemo03 {
public static void main(String[] args) throws IOException {
// abc.java 不带盘符的,就是相对路径,相对的路径就是当前project路径
// File f0 = new File("abc.java");
// File f0 = new File("day08\\abc.java");
// System.out.println(f0.createNewFile());

// 删除文件 delete不走回收站
// System.out.println(f0.delete());

//  File f0 = new File("day08\\abc\\cde");
//  f0.mkdirs();
// File f1 = new File(f0,"abc.java");
// f1.createNewFile();

// delete方法,删除的时候文件夹下的不能有内容 ,否则删不掉
File f0 = new File("day08\\abc");
System.out.println(f0.delete());

}
}

总结:

绝对路径: 带盘符的路径

相对路径: 找多个文件或者是目录相同的路径

// 获取当前电脑中的所有的盘符
File[] files = File.listRoots();
System.out.println(Arrays.toString(files));

// boolean isHidden(): 判断一个文件是否是一个隐藏的文件
File file = new File("d:\\test\\day07_作业.wmv");
System.out.println(file.isHidden());

// long length(): 获取一个文件的大小 字节数
System.out.println(file.length());

二.递归

递归概述

  • 什么是递归?
  • 递归有哪些注意事项?
  • 总结:
  1. 什么是递归
      方法本身调用方法本身自己(自己玩自己)
  2. 注意事项
      一定要有出口
    • 递归的层次不要太深
  • 递归的思想:

    将一个大问题,分解成若干个小问题,再将若干个小问题,再去分解成若干个小问题
    若干个小问题完成,最终这一个大的问题也就完成了
  • 案例代码:

  • public static int dg(int n){
    // 递归的出口
    if (n == 1 || n == 2)
    return 1;
    
    return dg(n - 1) + dg(n - 2);
    }

    递归求5的阶乘

    • 需求: 5! -> 5 * 4 * 3 * 2 * 1 = 120
    • 递归的思路:

      5! = 5 * 4!

         4! = 4 * 3!

            3! = 3 * 2!

               2! = 2 * 1!

    • 案例代码:

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

    递归遍历目录

    • 案例需求:

    给定一个路径(E:\itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台

    • 代码:
    public class DiGuiDemo02 {
    public static void main(String[] args) {
    //根据给定的路径创建一个File对象
    File srcFile = new File("E:\\教学视频\\web\\day01_MySQL基础");
    //调用方法
    getAllFilePath(srcFile);
    }
    
    //定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象
    public static void getAllFilePath(File srcFile) {
    //获取给定的File目录下所有的文件或者目录的File数组
    File[] fileArray = srcFile.listFiles();
    //遍历该File数组,得到每一个File对象
    if(fileArray != null) {
    for(File file : fileArray) {
    //判断该File对象是否是目录
    if(file.isDirectory()) {
    //是:递归调用
    getAllFilePath(file);
    } else if (file.isFile()){
    //不是:获取绝对路径输出在控制台
    System.out.println(file.getAbsolutePath());
    }
    }
    }
    }
    }

    三.IO流

    IO概述

    • 问题: IO流是什么? 其作用又有哪些?
    • 总结:

    I: In 进入

    O: Out 出

    IO流的作用: 就是用来数据的持久化的

    IO流的分类

    • 按流向分:

      输入流
    • 输出流
  • 按数据类型分:

      字节流
    • 字符流
  • IO体系结构顶层父类

      字节流:

      输入流 : InputStream
  • 输出流 : OutputStream

  • 字符流:

      输入流 : Reader
  • 输出流 : Writer

  • 字节输出流OutputStream介绍

    • OutputStream的作用?

    以字节流的形式 将内容写入到文件中

    • 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) :将指定的字节输出流。
    • OutputStream 下的子类有哪些?

      FileOutputStream
    • ObjectOutputStream
    • BufferedOutputStream
  • FileOutputStream 构造方法:

      FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流。 直接写文件的路径
  • FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
  • 将字符的路径封装成File对象 ,然后将File对象传递给 FileOutputStream构造方法中
  • 字节流写数据的三种方式

    • void write(int b)将指定的字节写入此文件输出流 一次写一个字节数据
    • void write(byte[] b)将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据
    • void write(byte[] b, int off, int len)将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据

    字节流写数据的两个小问题(理解即可)

    • 字节流写数据如何实现换行?

    windows:\r\n

    linux:\n

    mac:\n

    • 这几个换行符不是跨平台的,在windows中写/r/n 不一定能在linux或mac中能使用
    • 字节流写数据如何实现追加写入

      FileOutputStream(String name,boolean append)
    • FileOutputStream(File file, boolean append)
    • boolean append : 默认为false , 不追加数据,每一次写数据都是在文件的开头写,而不是末尾
    • boolean append : true 追加数据

    字节流读数据

    • 字节输入流InputStream介绍
    • FileInputStream 的作用?

    从文件中读取数据的

    • 构造方法 :

      FileInputStream(File file) : 将要读取的数据源, 所在的目录位置, 以file对象的形式给出
    • FileInputStream(String fileName) : 将要读取的数据源, 所在的目录位置, 以file对象的形式给出
  • 一般方法 :

      int read() : 从此输入流中读取一个字节数据。
    • int read(byte[] b) : 从输入流中读取一个字节数组 -> 读取一组数据
    • public void close(): 释放资源
  • InputStream 下的子类有哪些?

      FileInputStream
    • ObjectInputStream
    • BufferedInputStream
    • 一次读一个字节数据
    • 步骤:

      字节输入流读取数据的步骤
    • 创建字节输入流对象
    • 调用字节输入流对象的读数据方法
    • 释放资源
  • 案例演示:

  • public class FileInputStreamDemo01 {
    public static void main(String[] args) throws Exception {
    
    // 创建FileInputStream对象,并指定读取的文件
    FileInputStream fis = new FileInputStream(new File("day08\\b.txt"));
    
    // 定义变量 记录读取的字节
    int len;
    while ((len = fis.read()) != -1) {
    System.out.print((char)len);
    }
    
    // 释放资源
    fis.close();
    }
    }
    • 一次读一个字节数组数据
    • 总结:

      数组的长度定义为多少?

      1024 或 1024的整数倍
  • 定义数组的作用是什么?

      定义数组起到一个缓冲的作用
  • 定义变量 len 的作用是什么?

      记录了实际读取的字节数
    • 一次读一个字节数组数据
    • 总结:

      数组的长度定义为多少?

      1024 或 1024的整数倍
  • 定义数组的作用是什么?

      定义数组起到一个缓冲的作用
  • 定义变量 len 的作用是什么?

      记录了实际读取的字节数

      new String(bys,0,len);
    • 点赞
    • 收藏
    • 分享
    • 文章举报
    Naker_ 发布了48 篇原创文章 · 获赞 6 · 访问量 528 私信 关注
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: