JavaSE基础进阶知识笔记—File、递归、IO流

系列文章目录

JavaSE基础进阶知识笔记之File、递归、IO流



前言

在这里插入图片描述
在这里插入图片描述


一、File类概述

在这里插入图片描述
在这里插入图片描述

package org.example.file;

import java.io.File;

/**
 *  目标:创建File文件时需要注意的点
 */
public class Demo {
    public static void main(String[] args) {
        /**
         * 路径有三种格式:
         *      1、‪D:\\demo\\a.txt   使用俩个\\,避免转义
         *      2、‪D:/demo/a.txt   使用/,不存在转义
         *      3、
         */
       // File f=new File("D:/demo/a.txt ");
        File f1=new File("D:"+File.separator+"demo"+File.separator+"a.txt");
        System.out.println(f1.length());


        /**
         * 以上为绝对路径
         * 路径有相对路径:从工程开始
         */

        /**
         * file创建对象,可以是文件,也可以是文件夹
         */
    }
}

在这里插入图片描述

二、File类常用API

1.判断文件类型,获取文件信息

在这里插入图片描述

package org.example.file;

import java.io.File;
import java.text.SimpleDateFormat;

public class FileDemo2 {
    public static void main(String[] args) {
        //1.绝对路径创建一个文件对象
        File f=new File("D:/demo/a.txt");
        //a.获取它的绝对路径
        System.out.println(f.getAbsolutePath());
        //b.获取文件定义时候用的路径
        System.out.println(f.getPath());
        //c.获取文件名称,带后缀
        System.out.println(f.getName());
        //d.获取文件大小,字节个数
        System.out.println(f.length());
        //e.获取文件最后修改时间
        long lastModified = f.lastModified();
        System.out.println("最后修改时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(lastModified));
        //f.判断文件为文件夹还是文件
        System.out.println(f.isFile());
        System.out.println(f.isDirectory());
    }
}

2.创建文件、删除文件功能

在这里插入图片描述

3.遍历文件夹

在这里插入图片描述

三、方法递归

1.方法递归的形式和特点

在这里插入图片描述

package org.example.file;

public class Demo3 {
    public static void main(String[] args) {
        test();
    }
    public static void test(){
        System.out.println("=============test被执行==========");
        test2();
    }
    public static void test2(){
        System.out.println("=============test2被执行==============");
        test3();
    }

    private static void test3() {
        System.out.println("=================test3被执行==============");
        test2();
    }
}

2.递归的算法流程、核心要素

在这里插入图片描述

在这里插入图片描述

package org.example.rescusion;

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

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

在这里插入图片描述

3.递归常见案例

在这里插入图片描述

package org.example.rescusion;

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

    public static int f(int n) {
        if (n == 1) {
            return 1;
        } else {
            return f(n - 1) + n;
        }
    }
}

4.递归的经典问题

在这里插入图片描述

package org.example.rescusion;

/**
 * 猴子吃桃问题
 * 公式:f(x)-f(x)/2-1=f(x+1)
 * f(x)=2f(x+1)+2
 * 终结点:f(10)=1;
 * 递归方向:合理的
 * 求f(1)=?
 */
public class Demo3 {
    public static void main(String[] args) {
        System.out.println(f(1));
    }

    public static int f(int n) {
        if (n == 10) {
            return 1;
        } else {
            return 2 * f(n + 1) + 2;
        }
    }
}

5.非规律化递归案例—文件搜索

package org.example.rescusion;

import java.io.File;

/**
 * 目标:去D盘搜索a.txt文件
 */
public class Demo4 {
    public static void main(String[] args) {
        //2.传入目录和文件名称
        searchFile(new File("D:/"), "a.txt");
    }

    /**
     * 1.搜索某个目录下的全部文件,找到我们想要的文件
     *
     * @param dir      被搜索的目录
     * @param FileName 被搜索的文件名称
     */
    public static void searchFile(File dir, String FileName) {
        //3.判断dir是否是目录
        if (dir != null && dir.isDirectory()) {
            //可以找了
            //4.提取当前目录下的一级文件对象
            File[] files = dir.listFiles();
            //5.判断是否存在一级文件对象,存在才可以遍历
            if (files != null && files.length > 0) {
                for (File file : files) {
                    //6.判断当前一级文件对象时文件还是目录
                    if (file.isFile()) {
                        //7.是不是咋们要找的,是则输出路径即可
                        if (file.getName().contains(FileName)) {
                            System.out.println("找到了:" + file.getAbsolutePath());
                        }

                    } else {
                        //8.是文件夹,需要继续递归寻找
                        searchFile(file, FileName);
                    }
                }
            } else {
                System.out.println("对不起,当前文件夹没有内容!");
            }
        } else {
            System.out.println("对不起,当前搜索的位置不是文件夹!");
        }
    }
}

5.非规律化递归案例—啤酒案例

在这里插入图片描述

package org.example.rescusion;

public class Demo5 {
    //定义一个静态成员成员变量用于可以存储买的酒数量
    public static int totalNumber;//总数量
    public static int lastBottomNumber;//每次剩余的瓶子个数
    public static int lastCoverNumber;//每次剩余的盖子个数

    public static void main(String[] args) {
        //1.拿钱买酒
        buy(10);
        System.out.println("总数"+totalNumber);
        System.out.println("剩余盖子数"+lastCoverNumber);
        System.out.println("剩余瓶子数"+lastBottomNumber);
    }

    private static void buy(int money) {
        //2.看可以立马买多少瓶酒
        int buyNumber = money / 2;
        totalNumber += buyNumber;

        //3.把盖子和瓶子换算成钱
        //统计本轮总的盖子数和瓶子数
        int coverNumber = lastCoverNumber + buyNumber;
        int bottomNumber = lastBottomNumber + buyNumber;


        //统计可以换算的钱
        int allMoney = 0;
        if (coverNumber >= 4) {
            allMoney += (coverNumber / 4) * 2;
        }
        lastCoverNumber = coverNumber % 4;
        if (bottomNumber >= 2) {
            allMoney += (bottomNumber / 2) * 2;
        }
        lastBottomNumber = bottomNumber % 2;

        if (allMoney>=2){
            buy(allMoney);
        }
    }
}

四、字符集

在这里插入图片描述

1.常见字符集介绍

在这里插入图片描述
在这里插入图片描述

2.字符集的编码、解码操作

在这里插入图片描述

在这里插入图片描述

package org.example.charset;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/**
 *      编码和解码
 */
public class Demo {
    public static void main(String[] args) throws Exception {
        //1.编码:把文字转换成字节(使用指定编码)
        String name="我爱你中国4567";
        byte[] bytes = name.getBytes();//以当前代码默认字符集进行编码(UTF-8)
        byte[] bytes1 = name.getBytes("GBK");//指定编码
        System.out.println(bytes.length);
        System.out.println(Arrays.toString(bytes));

        //2.解码:把字节转换成对应的中文形式(编码前和编码后的字符集必须一致,否则乱码)
        String rs=new String(bytes);
        System.out.println(rs);
        String rs1=new String(bytes1,"GBK");//指定GBK解码
        System.out.println(rs1);
    }
}

五、IO流概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

六、字节流的使用

1.文件字节输入流:每次读取一个字节

在这里插入图片描述
在这里插入图片描述

package org.example.stream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class Demo1 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        InputStream stream = new FileInputStream("file-io-app/src/data.txt");

        //2.读取一个字节返回(每次读取一滴水)
//        int b = stream.read();//读取完毕返回-1
//        System.out.println((char) b);

        //3.使用循环改进(中文会出现乱码)
        int b1;
        while ((b1 = stream.read()) != -1) {
            System.out.println((char) b1);
        }
    }
}

2.文件字节输入流:每次读取一个字节数组

在这里插入图片描述

package org.example.stream;

import java.io.FileInputStream;
import java.io.InputStream;

public class Demo2 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        InputStream stream = new FileInputStream("file-io-app/src/data.txt");

        //2.定义字节数组,用于读取字节数组
//        byte[] buffer=new byte[3];
//        int len=stream.read(buffer);
//        System.out.println("读取了几个字节:"+len);
//        String rs=new String(buffer);
//        System.out.println(rs);


        //3.改进使用循环,每次读取一个数组
        byte[] buffer=new byte[3];
        int len;//记录每条读取的字符数
        while ((len=stream.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
    }
}

3.文件字节输入流:一次读完全部字节

在这里插入图片描述
在这里插入图片描述

package org.example.stream;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Arrays;

public class Demo3 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        File f=new File("file-io-app/src/data.txt");
        InputStream stream = new FileInputStream(f);

        //2.定义字节数组,用于读取字节数组

        byte[] buffer=new byte[(int) f.length()];
        int len = stream.read(buffer);
        System.out.println("字节长度"+len);
        String s = new String(buffer);
        System.out.println(s);
    }
}

4.文件字节输出流:写字节数据到文件

在这里插入图片描述
在这里插入图片描述

package org.example.stream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Demo4 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输出流管道与目标文件接通
        //追加数据
        FileOutputStream os=new FileOutputStream("file-io-app/src/out.txt",true);

        //先清空之前的数据,再写数据进去
//        FileOutputStream os=new FileOutputStream("file-io-app/src/out.txt");

        //2.写数据出去
        //写一个字节出去
        os.write('a');
        //写一个字节数组出去
        byte[] buffer={'a',45,83,54};
        os.write(buffer);
        os.write("\r\n".getBytes());//换行

        byte[] buffer2="我是中国人".getBytes();
        os.write(buffer2);
        //写一个字节数组一部分出去
        byte[] buffer3={'a',45,83,54};
        os.write(buffer,0,2);


        //os.flush();//写数据必须刷新数据,可以继续使用流
        os.close();//释放资源,包含刷新的,关闭后流不可以使用
    }
}

5.文件拷贝

在这里插入图片描述

package org.example.stream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 学会使用字节流完成文件的复制(支持一切文件的复制)
 */
public class CopyDemo {
    public static void main(String[] args) {

        try {
            //1.创建一个字节输入流管道与原视频接通
            FileInputStream is=new FileInputStream("C:\\Users\\王文龙\\Pictures\\Saved Pictures\\1.png");

            //2.创建一个字节输出流管道与目标文件接通
            FileOutputStream os=new FileOutputStream("file-io-app/src/a.png");

            //3.定义一个字节数组转移数据
            byte[] buffer=new byte[1024];
            int len;
            while ((len=is.read(buffer))!=-1){
                os.write(buffer,0,len);
            }

            System.out.println("复制完成了");


            //4.关闭流
            os.close();
            is.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

七、资源释放的方式

1.try-catch-finally

在这里插入图片描述

2.try-with-resource

在这里插入图片描述
在这里插入图片描述

八、字符流的使用

1.文件字符输入流—一次读取一个字符

在这里插入图片描述
在这里插入图片描述

2.文件字符输入流—一次读取一个字符数组

在这里插入图片描述

3.文件字符输出流

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


总结

学会使用对文件的基本操作和文件的字节流和字符流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值