day09-File-递归-IO流【JAVA】

目录

File

递归

IO流


File

  • 获取它目录下所有的文件

    • String[] list()

    • File[] listFiles()

import java.io.File;
​
public class Test {
    /*
        目标:能够使用API提供的方法,实现遍历某一层文件夹下的所有文件
​
     */
    public static void main(String[] args) {
        // 先关联到itheima的文件夹
        File file = new File("day08-Stream-Exception-File/src/com/itheima");
        // 再调用方法获取里面的所有的文件名称/文件对象
        String[] fileNames = file.list();
        // 遍历
        for (String fileName : fileNames) {
            System.out.println(fileName);
        }
        System.out.println("-------------------------");
        File[] files = file.listFiles();
        for (File f : files) {
            System.out.println(f.getName());
        }
        System.out.println("-------------------------------------");
        // 关联的是一个不存在的路径
        File file2 = new File("day08-Stream-Exception-File/src/com/itheima2");
        System.out.println(file2);
        // 空的数组对象
        File[] files1 = file2.listFiles();
        System.out.println(files1); // null
        // 出现空指针异常
     /*   for (File file1 : files1) {
            System.out.println(file1);
        }*/
        System.out.println("--------------------------");
        // 关键的是一个空的文件夹
        File file3 = new File("day09-file-IO/file");
        File[] files2 = file3.listFiles();
        System.out.println(files2);  // [Ljava.io.File;@119d7047
        System.out.println(files2.length); // 0
    }
}
​

递归

  • 概念

    • 方法自己调用自己

  • 格式

    • 直接递归

      • 方法自己调用自己

    • 间接递归

      • 方法相互调用

        public class Test {
            /*
                目标:
                       能够说出递归的执行流程
        ​
             */
            public static void main(String[] args) {
                // method();
                a();
            }
        ​
            // 直接递归,方法调用自己
            public static void method() {
                System.out.println("这里是执行了method的方法~~~11");
                method(); // 自己调用自己
                System.out.println("这里是执行了method的方法~~~22");
            }
        ​
            // 间接递归,方法相互调用
            public static void a() {
                System.out.println("执行了a方法");
                b();
                System.out.println("执行完了a方法");
        ​
            }
        ​
            public static void b() {
                System.out.println("执行了b方法");
                a();
                System.out.println("执行完了b方法");
            }
        ​
        }
        ​

  • 流程

    • 层层递进,不断回归

  • 使用场景

    • 多层包含的时候

      • 文件夹遍历

      • 类目的创建

    • 算法

      • 二分查找

      • 斐波那契数列

      • 汉诺塔

import java.io.File;
​
public class Test {
    /*
        目标:能够使用递归的思想,实现找出某一个文件夹下所有的java
​
     */
    public static void main(String[] args) {
        searchJava(new File("D:\\java_code\\JAVASE\\Java190"));
    }
​
    /*
        1.定义一个方法,接收一个文件夹对象[File]
        2.先判断传递归来的对象是否为null ,或者 先判断调用这个方法是否为空 ,再去 listFile长度是否为0,如果是,则直接结束方法
        3.遍历传递过来的File对象
        4.遍历的时候,判断每一个file对象的类型
            4.1 如果是文件,我们还需要判断这个文件是否为 java文件==> 获取文件名字,再判断是否以java结尾
                如果是,则输出绝对经路径
​
            4.2 如果是文件夹
                直接递归
     */
    public static void searchJava(File f) {
        // 2.先判断传递归来的对象是否为null ,或者 先判断调用这个方法是否为空 ,再去 listFile长度是否为0,如果是,则直接结束方法
        if (f == null || !f.exists() || !f.isDirectory() || f.listFiles().length == 0) {
            return;
        }
        // 3.遍历传递过来的File对象
        File[] files = f.listFiles();
        for (File file : files) {
            //  4.遍历的时候,判断每一个file对象的类型
            if (file.isFile() && file.getName().endsWith(".java")) { //  如果是文件,我们还需要判断这个文件是否为 java文件==> 获取文件名字,再判断是否以java结尾
                System.out.println(file.getAbsolutePath());
            } else if (file.isDirectory()) {
                searchJava(file);
            }
        }
    }
​
}

IO流

字符的编码和解码

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
​
public class Test {
    /*
        了解如何实现字符的编码和解码
     */
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "黑马Java";
        // 编码
        byte[] bytes = str.getBytes();// 使用系统默认的
        // 1110xxxx 10xxxxxx 10xxxxxx   ,
        // [-23, -69, -111, -23, -87, -84, 74, 97, 118, 97]
        System.out.println(Arrays.toString(bytes));
​
        // 指定字符集  --> utf-8
        byte[] bytes2 = str.getBytes(StandardCharsets.UTF_8);
        System.out.println(Arrays.toString(bytes2));
​
​
        byte[] bytes3 = str.getBytes("gbk");
        // [-70, -38, -62, -19, 74, 97, 118, 97]
        System.out.println(Arrays.toString(bytes3));
​
        System.out.println("---------------解码----------------------");
        // 先解bytes
        String s1 = new String(bytes);
        System.out.println(s1); // 黑马Java
        // 解gbk的字节数组
        String s2 = new String(bytes3, Charset.forName("gbk"));
        System.out.println(s2);
​
        // 用gbk解utf-8
        String s3 = new String(bytes2, "gbk");
        System.out.println(s3); // 榛戦┈Java
​
​
    }
}
​

  • 概念

    • 输入(Input)\输出(Out)流

  • 分类

    • 字节流

      • 使用对象

        • 所有的文件

      • 字节输入流

        • 作用

          • 把文件的内容读取到java程序中

        • 方法

          • 读一个字节

            • read(int n)

          • 读多个字节,返回读到的长度

            • int read(byte[] bytes)

          • 读所有字节,返回读到的字节数组

            • byte[] readAllBytes()

          • 关流

            • close()

              import java.io.FileInputStream;
              import java.io.FileNotFoundException;
              import java.io.FileOutputStream;
              import java.io.IOException;
              ​
              public class Test {
                  public static void main(String[] args) throws Exception {
                      // 1.先要创建一个输入流,关联文件
                      FileInputStream fis = new FileInputStream("day09-file-IO/file/kun.png");
                      // 2.也要创建一个输出流,把内容写出到指定的地方
                      FileOutputStream fos = new FileOutputStream("day09-file-IO/file/kun3.png");
              ​
                      // 3.定义一个数组,用于存放读取到的内容
                      byte[] bytes = new byte[1024 * 8]; // 8kb的容器
                      // 4.定义一个整数,用于记录读取到的长度
                      int len;
                      // 5.使用循环去读数据 ,写数据 【一边读,一边写】
                      while ((len = fis.read(bytes)) != -1) {
                          fos.write(bytes, 0, len);
                      }
                      // 6.关流
                      fos.close();
                      fis.close();
              ​
                  }
              ​
                  private static void copyAll() throws IOException {
                      // 1.使用字节输入流,读取原文件
                      FileInputStream fis = new FileInputStream("day09-file-IO/file/kun.png");
                      // 2.一次性读取所有的内容,用一个数组保存
                      byte[] bytes = fis.readAllBytes();
                      // 3.创建一个字节输出流,指定文件保存的位置
                      FileOutputStream fos = new FileOutputStream("day09-file-IO/file/kun2.png");
                      // 4.把读取到的数组写出去即可
                      fos.write(bytes);
                      // 5.关流 --> 先开后关
                      fos.close();
                      fis.close();
                  }
              }
              ​

      • 字节输出流

        • 作用

          • 把Java程序中的内容,输出到指定的文件

        • 方法

          • 写出一个字节

            • write(int n)

          • 写出一个字节数组

            • write(byte[] bytes)

          • 写出一个字节数组的部分内容

            • write(byte[] bytes , 起始位置, 长度)

          • 关流

            • close()

              import java.io.File;
              import java.io.FileInputStream;
              import java.io.FileNotFoundException;
              import java.util.Arrays;
              ​
              public class Test {
                  /*
                      目标:
                          能够使用字节数组去存储读取的内容。然后 对比跟读取跟个字节的方法
              ​
                   */
                  public static void main(String[] args) throws Exception {
                      // 先用流关联到文件
                      FileInputStream fis = new FileInputStream("day09-file-IO/file/b.txt");
                      // 我们创建一个字节数组,用于存放读取的内容
                      //byte[] bytes = new byte[3]; // {0 ,0 ,0}
                      // 定义足够大的数组
                      byte[] bytes = new byte[1024]; // {0 ,0 ,0}
              ​
                      // 我们需要对字节数组进行编码 ==> String的构造器
                  /*    int len = fis.read(bytes);
                      System.out.println("len:" + len); // 3
                      System.out.println("bytes:" + Arrays.toString(bytes));// [74, 97, 118]
                      String s1 = new String(bytes); // 解码
                      System.out.println(s1); // Jav
              ​
                      int len2 = fis.read(bytes);
                      System.out.println("len2:" + len2);
                      System.out.println("bytes:" + Arrays.toString(bytes));// [97, 83, 69]
                      String s2 = new String(bytes); // 解码
                      System.out.println(s2); // aSE
              ​
                      int len3 = fis.read(bytes);
                      System.out.println("len3:" + len3);// 2
                      System.out.println("bytes:" + Arrays.toString(bytes)); // [97, 97, 69]
                     *//* String s3 = new String(bytes);  // 如果使用这个方法,会把69也进行解码
                      System.out.println(s3); // aaE*//*
              ​
                      String s3 = new String(bytes , 0 , len3);
                      System.out.println(s3); // aa */
                      // 用于记录当前读取的内容的长度
                      int len;
                      while ((len = fis.read(bytes)) != -1) {
                          String s = new String(bytes, 0, len);
                          System.out.print(s);
                      }
              ​
                      fis.close();
                  }
              }
              ​

    • 字符流

      • 使用对象

        • 文本

IO流整体练习

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
​
public class Test {
    public static void main(String[] args) throws Exception {
        // 1.先要创建一个输入流,关联文件
        FileInputStream fis = new FileInputStream("day09-file-IO/file/kun.png");
        // 2.也要创建一个输出流,把内容写出到指定的地方
        FileOutputStream fos = new FileOutputStream("day09-file-IO/file/kun3.png");
​
        // 3.定义一个数组,用于存放读取到的内容
        byte[] bytes = new byte[1024 * 8]; // 8kb的容器
        // 4.定义一个整数,用于记录读取到的长度
        int len;
        // 5.使用循环去读数据 ,写数据 【一边读,一边写】
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }
        // 6.关流
        fos.close();
        fis.close();
​
    }
​
    private static void copyAll() throws IOException {
        // 1.使用字节输入流,读取原文件
        FileInputStream fis = new FileInputStream("day09-file-IO/file/kun.png");
        // 2.一次性读取所有的内容,用一个数组保存
        byte[] bytes = fis.readAllBytes();
        // 3.创建一个字节输出流,指定文件保存的位置
        FileOutputStream fos = new FileOutputStream("day09-file-IO/file/kun2.png");
        // 4.把读取到的数组写出去即可
        fos.write(bytes);
        // 5.关流 --> 先开后关
        fos.close();
        fis.close();
    }
}
​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值