File类和File类的基本方法,字符集使用以及方法递归案例

1.File类

File和IO流概述

存储数据的方案

变量01数组02对象03集合04
double money=999.0;int[] age = new int[10];Student s = new Student()List students = new ArrayList<>();

它们都是内存中的数据容器

它们记住的数据,在断电,或者程序终止时会丢失
在这里插入图片描述

文件是非常重要的存储方式,在计算硬盘中

即使断电,或者程序终止了,存储在硬盘文件中的数据也不会丢失

在这里插入图片描述

File

Fiel是java.io包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)

获取文件信息(大小、文件名,修改时间)判断文件的类型

创建文件/文件夹 删除文件/文件夹 。。。

注意:File类只能对文本本身进行操作,不能读写文件里面存储的数据。

IO流

用于读取数据的(可以读写文件,或网络中的数据…)

FIle:代表文本 Io流:读写数据

1.1创建对象

创建File类的对象:

构造器说明
public File(String pathname)根据文件路径创建文件对象
public File(String parent,String child)根据父路径和子路径名字创建文件对象
public File(File parent,String child)根据父路径对应文件对象和子路径名字创建文件对象

注意:

File对象既可以代表文件、也可以代表文件夹

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

  • 绝对路径和相对路径

  • 绝对路径:从盘符开始

File file1 = new File(“D:\\123\\a.txt”)
  • 相对路径:不带盘符,默认直接到当前工程下的目录寻找文件
File file2 = new File("模块名\\a.txt")
import java.io.File;

public class FileMethod {
    public static void main(String[] args) {
        File file = new File("D:\\mynew\\a.txt");
//File f1= new File("D"+File.separator+"mynew\\a.txt") 一样的作用
   //File.separator可以替换\\
        //获取File的一个对象,指定具体的文件
        
        
        //如果只要反斜杠/就只要写一个/符号
    //    File file = new File("D:/mynew/a.txt");
        
        
        System.out.println(file.length());//获取字节大小
        


    }
}

在这里插入图片描述

import java.io.File;

public class FileMethod {
    public static void main(String[] args) {
        File file = new File("D:/mynew//nan.txt");//可以指定不存在的文件夹
        System.out.println(file.length());
        System.out.println(file.exists());//不存在返回flase

    }
}

在这里插入图片描述

import java.io.File;

public class FileMethod {
    public static void main(String[] args) {
        File file = new File("D:/mynew","mynewson/ason.txt");
        // public File(String parent,String child)
       // 根据父路径和子路径名字创建文件对象
        System.out.println(file.length());

    }
}

import java.io.File;

public class FileMethod {
    public static void main(String[] args) {
      File file = new File("D:/mynew");
      File file1 = new File(file,"mynewson/ason.txt");
       //根据父路径对应文件对象和子路径名字创建文件对象 
 // public File(File parent,String child) System.out.println(file1.getAbsolutePath());
        //D:\mynew\mynewson\ason.txt
        System.out.println(file1.length());//9

    }
}

1.2常用方法1:判断文件类型、获取文件信息

File类提供的判断文件类型,获取文件信息功能

方法名称说明
public boolean exists()判断当前文件对象,对应的文件路径是否存在,存在返回true
public boolean isFile()判断当前文件对象指代的是否是文件,是文件返回ture,反之
public boolean isDirectory()判断当前文件对象指代的是否是文件夹,是文件夹返回ture,反之
public String getName()获取文件的名称(包含后缀)
public long length()获取文件的大小,返回字节个数
public long lastModified()获取文件的最后修改时间
public String getPath()获取创建文件对象时,使用的路径
public String getAbsolutePath获取绝对路径
import java.io.File;

public class FileMethod {
    public static void main(String[] args) {
      File file = new File("D:/mynew");
      File file1 = new File(file,"mynewson/ason.txt");
//        public boolean exists()判断当前文件对象,对应的文件路径是否存在,存在返回 true
        System.out.println(file.exists());
//        public boolean isFile()判断当前文件对象指代的是否是文件,是文件返回ture,反之
        System.out.println(file.isFile());
//        public boolean isDirectory()判断当前文件对象指代的是否是文件夹,是文件夹返回ture,反之
        System.out.println(file.isDirectory());
//        public String getName()获取文件的名称(包含后缀)
        System.out.println(file.getName());

//        public long length()获取文件的大小,返回字节个数
        System.out.println(file.length());
//        public long lastModified()获取文件的最后修改时间
        System.out.println(file.lastModified());
//        public String getPath()获取创建文件对象时,使用的路径
        System.out.println(file.getPath());
//        public String getAbsolutePath获取绝对路径
        System.out.println(file.getAbsolutePath());
    }
}

1.3常用方法2:创建文件、删除文件

  • 1.File类创建文件的功能
方法名称说明
public boolean createNewFile()创建一个新的空文件
public boolean mkdir()只能创建一级文件夹
public boolean mkdirs()可以创建多级文件夹
import java.io.File;
import java.io.IOException;

public class FileMethod {
    public static void main(String[] args) throws IOException {
      File file = new
      File("D:/mynew1");
        
      File file1 = new File("D:/mynew/mynewson/bson.txt");
        
      File file2 = new File("D:/mynew2/mynewson/cson.txt");
//     public boolean createNewFile()创建一个新的空文件
        file1.createNewFile();
      System.out.println(file1.exists());
//     public boolean mkdir()只能创建一级文件夹
      file.mkdir();
      System.out.println(file.exists());
//     public boolean mkdirs()可以创建多级文件夹
      file2.mkdirs();
      System.out.println(file2.exists());
 



    }
}

在这里插入图片描述

 File file1 = new File("D:/mynew/mynewson/bson.txt“)
  file1.createNewFile();
      System.out.println(file1.exists());
                       //创建一个新的空文

在这里插入图片描述

  File file = new
      File("D:/mynew1");
//     public boolean mkdir()只能创建一级文件夹
      file.mkdir();
      System.out.println(file.exists());

在这里插入图片描述

     File file2 = new File("D:/mynew2/mynewson/cson.txt");
//     public boolean mkdirs()可以创建多级文件夹
      file2.mkdirs();
      System.out.println(file2.exists());
  • File类删除文件的功能
方法名称说明
public boolean delete()删除文件、空文件夹

注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站

1.4常用方法3:遍历文件夹

方法名称说明
public String[] list()获取当前目录下所有的”一级文件名称”到一个字符串数组中去返回
public File[] listFiles()获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回
import java.io.File;
import java.io.IOException;

public class FileMethod {
    public static void main(String[] args) throws IOException {
      //public String[] list()获取当前目录下所有的”一级文件名称”到一个字符串数组中去返回
      // public File[] listFiles()获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回
      File file = new File("D:/mynew");
      String[] list = file.list();
      for (String s : list) {
          System.out.println(s);
      }
      System.out.println("----------------------------");
      File[] files = file.listFiles();
      for (File file1 : files) {
          System.out.println(file1);
      }

    }
}

a.txt
mynew1
mynew2
mynewson
----------------------------
D:\mynew\a.txt
D:\mynew\mynew1
D:\mynew\mynew2
D:\mynew\mynewson

进程已结束,退出代码0

使用listFiles方法时的注意事项:

当主调是文件,或者路径不存在时,返回null

当主调是空文件夹时,返回一个长度为0的数组

当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放到File数组中返回

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

当主调是一个文件夹,但是没有权限访问该文件夹时,返回null

2.方法递归

2.1什么是方法递归

递归是一种算法,在程序设计语言中广泛应用。

从形式上说:方法调用自身的形式称为方法递归。

2.1.1递归的形式

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

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

public class Recursion {
    public static void main(String[] args) {
        test();
    }
    public static void test(){
        test();
    }
    //直接递归
}

public class Recursion {
    public static void main(String[] args) {
        test2();
    }
    public static void test2(){
        System.out.println("test2");
        test3();
    }
    public static void test3(){
        System.out.println("test3");
        test2();
    }
    //间接递归
}

2.2递归的使用

2.2.1 计算n的阶乘
public class Recursion {
    public static void main(String[] args) {
        System.out.println(f(5));
        //f(n)=f(n-1)*n
        //f(n)=1*2*3*4**5*6*7*....*(n-1)*n
    }
    public static int f(int n){
        if(n==1){
            return 1;
        }
        return f(n-1)*n;
    }

}

递归算法三要素:

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

递归的终结点:f(1)

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

f(5)=f(4)*5

f(4)=f(3)*4

f(3)=f(2)*3

f(2)=f(1)*2

f(1)=1

2.2.2计算求递归求1-n 的和
public class Recursion {
    public static void main(String[] args) {
        System.out.println(f(5));
    }
    public static int f(int n){
        if(n==1){
            return 1;
        }
        return f(n-1)+n;
    }

}

2.2.3 猴子吃桃子问题

猴子第一天摘下若干个桃子,当即吃了一半,觉得好不过瘾,于是又多吃了一个

第二天又吃了前一天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个

以后每天都是吃前一天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个,等到第10天发现桃子只剩下1个了。

需求:请问猴子第一天摘了多少个桃子?

public class Recursion {
    public static void main(String[] args) {
    //f(x-1) =f(x)-f(x)/2-1
        //2f(x-1)=2f(x)-f(x)-2
        //2f(x-1)+2=f(x)
        System.out.println(f(10));

    }
public static int f(int x){
        if(x==1){
            return 1;
        }
        return 2*f(x-1)+2;
}
}
2.2.4文件搜索

需求:从D:盘中,搜索“LauncherGame.exe”(永劫无间)这个文件,找到后直接输出位置

分析:1.先找出D:盘下的所有一级文件对象

2.遍历全部一级文件对象,判断是否是文件

3.如果是文件,判读是否是自己想要的

4.如果是文件夹,需要

import java.io.File;

public class Recursion {
    public static void main(String[] args) {
File dir=new File("D:\\");
searchFile(dir,"LauncherGame.exe");
}
public static void searchFile(File dir, String fileName) {
        if(dir==null || !dir.exists()||dir.isFile()){
            return;//无法搜索
        }
        //dir不是null,存在,一定是目录对象
        //获取目录下的所有文件
        File[] files=dir.listFiles();
        if(files!=null&&files.length>0){
            for(File file:files){
                if(file.isFile()){
                    if(file.getName().equals(fileName)){
                        System.out.println("找到啦"+file.getAbsolutePath());
                    }
                }else{
                    searchFile(file,fileName);
                }
            }
        }
}
}
2.2.5啤酒问题

啤酒问题:啤酒2元一瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,求10元可以喝多少瓶?

package Recursion;

public class Beer {
    public static int totalNumber;//总酒数
    public static int lastBottleNumber;
    public static int lastCoverNumber;

    public static void main(String[] args) {
        //啤酒问题:啤酒2元一瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,求10元可以喝多少瓶?
        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 allBottleNumber = buyNumber+lastBottleNumber;
        int allCoverNumber = buyNumber+lastCoverNumber;
        int allMoney = 0;
        if(allBottleNumber>=2){
            allMoney = allBottleNumber/2*2;

        }
        lastBottleNumber = allBottleNumber%2;
        if(allCoverNumber>=4){
            allMoney+=allCoverNumber/4*2;
        }
        lastCoverNumber = allCoverNumber%4;
        if(allMoney>=2){
            buy(allMoney);
        }
    }
}

3.字符集

常见字符集介绍

3.1ASCII

标准ASCII(American Standard Code for Information Intercahnge):美国信息交换标准代码,包括了英文、符号等

标准ASCII使用1个字节存储一个字符,首尾是0,总共可表示128个字符,对美国佬来说完全够用

3.2GBK(汉字内码扩展规范,国标)

汉字编码字符集,包含了2万多个汉字等字符,GBK中一个中午符编码成两个字节的形式存储

注意:GBK兼容了ASCII字符集

xxxxxxxx xxxxxxxx|0xxxxxxx|xxxxxxxx xxxxxxxx

GBK规定:汉字的第一个字节的第一个位必须是1

3.3Unicode字符集(统一码,也叫万国码)

Unicode是国际组织制定的,可以容纳世界上所有文字、符号的字符集

UTF-32

4个字节表示一个字符

UTF-8

是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节

是英文字符、数字等只占1个字节(兼容ASCII编码),汉字字符占用3个字节。

在这里插入图片描述

注意:技术人员开发时都应该使用UTF-8编码

  • ASCII字符集:只有英文、数字、符号等,占1个字节
  • GBK字符集:汉字占2个字节,英文,数字占1个字节
  • UTF-8字符集:汉字占3个字节,英文,数字占1个字节

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

注意2:英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码。

3.4字符集的编码、解码操作

3.4.1 java代码完成对字符的编码
String提供了如下方法说明
byte[] getBytes()使用平台默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName)使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
3.4.2java代码完成对字符的解码
String提供了如下方法说明
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的String
String(byte[] bytes,String charsetName)通过指定的字符集解码指定的字节数组来构造新的String

----------------------------------------------------: |
| byte[] getBytes() | 使用平台默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |
| byte[] getBytes(String charsetName) | 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |

3.4.2java代码完成对字符的解码
String提供了如下方法说明
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的String
String(byte[] bytes,String charsetName)通过指定的字符集解码指定的字节数组来构造新的String
  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值