java-File、递归、IO流笔记

这篇博客详细介绍了Java中的File类,包括File类的创建、路径类型、常用API,如文件信息获取、创建和删除。接着讨论了递归的概念、问题及应用场景,如猴子吃桃、文件搜索和删除文件夹的递归实现。在字符集部分,讲解了ASCII、GBK、Unicode字符集及其注意事项。IO流部分涵盖了IO流的分类、字节流和字符流的使用,重点讲解了缓冲流、转换流和序列化。此外,还提到了PrintStream和PrintWriter以及Properties类的应用。
摘要由CSDN通过智能技术生成

目录

一、File

1.File类概述

2.File类创建对象

3.相对路径和绝对路径

4.File类的常用API

(1)判断文件类型、获取文件信息功能

(2)创建文件

(3)删除文件

(3)遍历

二、方法递归

1.递归的形式

2.方法递归存在的问题?

3.递归算法三要素

4.猴子吃桃案例

5.文件搜索案例

6.啤酒案例

7.删除文件夹

三、字符集

1.字符集概述

2.ASCII字符集

3.GBK字符集

4.Unicode字符集

5.注意事项

6.字符集编码

7.字符集解码

四、IO流

1.IO流概述

2.IO流的分类

(1)按流的方向分

(2)按流中的数据最小单位分

3.字节流

(1)文件字节输入流:FileInputStream

(2)文件字节输出流:FileOutputStream

(3)案例:文件拷贝

4.资源释放的方式

(1)try-catch-finally

(2)try-catch-resource

5.字符流

(1)文件字符输入流:FileReader

(2)字符输出流:FileWriter

6.缓冲流

(1)缓冲流概述

(2)字节缓冲流性能优化原理

(3)字节缓冲输入流:BufferedInputStream

(4)字节缓冲输出流:BufferedOutputStream

(5)字符缓冲输入流:BufferedReader

 (6)字符缓冲输出流:BufferedWriter

(7)案例:恢复文章顺序

7.转换流

(1)转换流概述

(2)如何解决代码编码和文件编码不一致导致的乱码问题?

(3) 字符输入转换流:InputStreamReader

(4)字符输入转换流:OutputStreamWriter

8.序列化对象

(1)对象序列化

(2)对象反序列化

9.打印流

(1)PrintStream

(2)PrintWriter

(3)PrintStream和PrintWriter的区别

(4)输出语句重定向

10.补充知识:Properties

(1)Properties核心作用:

(2)Properties的API

11.IO框架

(1)commons-io概述

(2)导入commons-io-2.6.jar

(3)FileUtils常用方法


一、File

1.File类概述

File类的对象代表操作系统的文件(文件、文件夹),File类在java.io.File包下。

File类提供了诸如:创建文件对象代表文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件夹)等功能。

2.File类创建对象

方法名称

说明

public File​(String pathname)

根据文件路径创建文件对象

public File​(String parent, String child)

根据父路径名字符串和子路径名字符串创建文件对象

public File​(File  parent, String child)

根据父路径对应文件对象和子路径名字符串创建文件对象

注意:File对象可以定位文件和文件夹

File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的。

3.相对路径和绝对路径

绝对路径:从盘符开始。

相对路径:不带盘符,默认直接到当前工程下的目录寻找文件。

4.File类的常用API

(1)判断文件类型、获取文件信息功能

方法名称

说明

public boolean isDirectory()

判断此路径名表示的File是否为文件夹

public boolean isFile()

判断此路径名表示的File是否为文件

public boolean exists()

判断此路径名表示的File是否存在

public long length()

返回文件的大小(字节数量)

public String getAbsolutePath()

返回文件的绝对路径

public String getPath()

返回定义文件时使用的路径

public String getName()

返回文件的名称,带后缀

public long lastModified()

返回文件的最后修改时间(时间毫秒值)

(2)创建文件

方法名称

说明

public boolean createNewFile()

创建一个新的空的文件

public boolean mkdir()

只能创建一级文件夹

public boolean mkdirs()

可以创建多级文件夹

(3)删除文件

方法名称

说明

public boolean delete​()

删除由此抽象路径名表示的文件或空文件夹

delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站。

(3)遍历

方法名称

说明

public String[] list()

获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。

public File[] listFiles()(常用)

获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)

listFiles方法注意事项:

当文件不存在时或者代表文件时,返回null 当文件对象代表一个空文件夹时,返回一个长度为0的数组

当文件对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回

当文件对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件

当没有权限访问该文件夹时,返回null

二、方法递归

1.递归的形式

直接递归:方法自己调用自己。

间接递归:方法调用其他方法,其他方法又回调方法自己。

2.方法递归存在的问题?

递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出现象。

3.递归算法三要素

递归的公式: f(n) =  f(n-1) * n

递归的终结点:f(1)

递归的方向必须走向终结点

4.猴子吃桃案例

/**
 * 猴子吃桃
 * 公式 f(x) - f(x)/2 - 1 = f(x+1)
 * 变形 2f(x) - f(x) - 2 = 2f(x+1)
 * f(x) = 2f(x+1) + 2
 * 求f(1)
 * 终结点 f(10) = 1
 */
public class RecursionDemo04 {
    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 d2_recursion;

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

/**
 * 文件搜索
 */
public class RecursionDemo05 {
    public static void main(String[] args) {
        searchFile(new File("D:/"), "Colors.exe");
    }

    /**
     * 搜索某个目录下的全部文件,找到我们想要的文件
     *
     * @param dir      被搜索的源目录
     * @param fileName 被搜索的文件名称
     */
    public static void searchFile(File dir, String fileName) {
        if (dir != null && dir.isDirectory()) {
            File[] files = dir.listFiles();
            if (files != null && files.length > 0) {
                for (File file : files) {
                    if (file.isFile()){
                        if (file.getName().contains(fileName)){
                            System.out.println("找到了:"+file.getAbsolutePath());
                            Runtime r=Runtime.getRuntime();
                            try {
                                r.exec(file.getAbsolutePath());
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }else {
                        searchFile(file,fileName);
                    }
                }
            }
        } else {
            System.out.println("当前搜索的不是文件夹");
        }
    }
}

6.啤酒案例

需求: 啤酒2元1瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶, 请问10元钱可以喝多少瓶酒,剩余多少空瓶和盖子。

package d2_recursion;

/**
 * 买啤酒问题
 */
public class RecursionDemo06 {
    public static int totalNumber;
    public static int lastBottleNumber;
    public static int lastCoverNumber;

    public static void main(String[] args) {
        buy(10);
        System.out.println("总数:"+totalNumber);
        System.out.println("空瓶:"+lastBottleNumber);
        System.out.println("盖子:"+lastCoverNumber);
    }

    public static void buy(int money) {
        int buyNumber = money / 2;
        totalNumber += buyNumber;

        int coverNumber = lastCoverNumber + buyNumber;
        int bottleNumber = lastBottleNumber + buyNumber;

        //把盖子和空瓶换成钱
        int allMoney = 0;
        if (coverNumber >= 4) {
            allMoney += (coverNumber / 4) * 2;
        }
        lastCoverNumber = coverNumber % 4;

        if (bottleNumber >= 2) {
            allMoney += (bottleNumber / 2) * 2;
        }
        lastBottleNumber = bottleNumber % 2;

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

7.删除文件夹

需求:删除非空文件夹

分析: ①:File默认不可以删除非空文件夹

②:我们需要遍历文件夹,先删除里面的内容,再删除自己。

package d2_recursion;

import java.io.File;

/**
 * 删除非空文件夹
 */
public class RecursionDemo07 {
    public static void main(String[] args) {
        File f = new File("E:\\aaa");
        deleteFile(f);
    }

    private static void deleteFile(File f) {
        //是文件,直接删除
        if (f.isFile()) {
            f.delete();
        }
        //当传入的是文件夹
        File[] files = f.listFiles();
        //是空文件夹 直接删除
        if (files == null || files.length == 0){
            System.out.println("删除:"+f.getAbsolutePath());
            f.delete();
        }
        //不是空文件夹 遍历删除
        for (File file : files) {
            if (file.isFile()){
                System.out.println("删除:"+file.getAbsolutePath());
                file.delete();
            }else if (file.isDirectory()){
                deleteFile(file);
            }
        }
        f.delete();
    }
}

三、字符集

1.字符集概述

字符集(Character Set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:  ASCII字符集、GBK字符集、Unicode(UTF-8)字符集等。

2.ASCII字符集

美国信息交换标准代码:包括了数字、英文、符号。

 ASCII使用1个字节存储一个字符,一个字节是8位,总共可以表示128个字符信息,对于表示英文、数字来说是够用的。

3.GBK字符集

GBK是中国的码表,包含了几万个汉字等字符,同时也要兼容ASCII编码, GBK编码中一个中文字符一般以两个字节的形式存储。

4.Unicode字符集

统一码,也叫万国码。是计算机科学领域里的一项业界标准。

UTF-8是Unicode的一种常见编码方式。

UTF-8编码后一个中文一般以三个字节的形式存储,同时也要兼容ASCII编码表。

5.注意事项

字符解码时使用的字符集和编码时使用的字符集必须一致,否则会出现乱码。

英文和数字在任何国家的编码中都不会乱码。

技术人员都应该使用UTF-8的字符集编码。

6.字符集编码

方法名称

说明

byte[] getBytes​()</

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值