目录
一、File
1.定义:
是java.io.包小的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。
2.创建File类的对象
- public File(String pathname):根据文件路径创建文件对象。
- public File(String parent,String child):根据父路径和子路径名字创建文件对象。
- public File(File parent,String child):根据父路径对应文件对象和子路径名字创建文件对象。
3.File提供的判断文件类型、获取文件信息功能
- public boolean exists():判断当前文件对象,对饮的文件路径是否存在,存在返回True。
- public boolean isFile():判断当前文件对象指代的是否是文件,是返回True。
- public boolean isDirectory():判断当前文件对象指代的是否是文件夹,是返回True。
- public String getName():获取文件的名称(包含后缀)
- public long lastModified():获取文件的大小,返回字节个数
- public String getPath():获取创建文件对象,使用的路径。
- public String getAbsolutePath():获取绝对路径。
4.File提供的创建的方法
- public boolean createNewFile():创建问价
- public boolean mkdir():创建一级文件夹
- public boolean mkdirs():创建多级文件夹
5.File类删除文件的功能
- public boolean delete():删除文件、文件夹,只能删除空文件夹。
6.File提供的遍历文件夹的方法
- public String[] list():获取当前目录下所有的“一级文件名称”到一个字符串数组中去。
- public File[] listFiles():获取当前目录下所有的“一级文件对象”到一个文件对象数组中去(重点)
使用listFiles方法时的注意事项:
- 当主调是文件,或者路径不存在时,返回null
- 当主调是空文件夹时,返回一个长度为0的数组。
- 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回。
- 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包括隐藏文件。
- 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null。
代码演示
package com.item.demo1Flie;
import java.io.File;
import java.io.IOException;
public class Fliedemo1 {
public static void main(String[] args) throws IOException {
//1.创建File类的对象
File f1 = new File("D:\\a.docx");
File f2=new File("D:/a.docx");
System.out.println(f1.length());//0
System.out.println(f2.length());//0
System.out.println(f1.exists());//true
System.out.println(f1.isFile());//true
System.out.println(f1.isDirectory());//false
System.out.println(f1.getName());//a.docx
//2.只要带盘符的都称之为绝对路径。
//3.相对路径:不带盘符的都是相对路径,一般都是找到项目根目录下的文件。
System.out.println(f1.getPath());//D:/a.docx
System.out.println(f1.getAbsolutePath());//D:/a.docx
File f3=new File("day3\\src\\dilei0.txt");
System.out.println(f3.length());//10
//4.创建对象代表不存在的文件路径
File f4=new File("D:/aa.docx");
System.out.println(f4.exists());//false
System.out.println(f4.createNewFile());//把这个文件创建出来,true
//5.创建对象代表不存在的文件夹,mkdir(),mkdirs()
File f5=new File("D:/bb");
System.out.println(f5.exists());//false
System.out.println(f5.mkdir());//只能创建一级文件夹,true
File f6=new File("D:/cc/aa");
System.out.println(f5.mkdirs());//可以创建多级文件夹,true
//6.创建File对象代表存在的文件,然后删除,
File f7=new File("D:/a.docx");
System.out.println(f7.delete());//删除文件,true,只能删除空文件夹。
//7.可以获取某个目录下的全部一级名称
File f8=new File("D:/");
String[] names=f8.list();
for (String name : names) {
System.out.println(name);
}
//8.可以获取某个目录下的全部一级文件对象
File[] files=f8.listFiles();
for (File file : files) {
System.out.println(file.getAbsoluteFile());
}
}
}
二、递归(了解递归算法,以便实现多级遍历找文件)
1.定义
递归是一种算法,在程序语言中广泛应用
从形式上说:方法调用自身的形式称为方法递归。
2.递归的形式
直接递归:方法自己调用自己
间接递归:方法调用其他方法,其他方法有回调方法自己。
3.递归三要素
- 递归的公式:
- 递归的终点:
- 递归的方向要走向终结点。
代码演示
例题:计算n的阶乘
需求:计算n的阶乘,5的阶乘=12345等
分析:1.f(n)=12…*(n-1)*n
2.那么公式等价于f(n)=f(n-1)*n
3.则求1-5的阶乘:
f(5)=f(4)*5
f(4)=f(3)*4
f(3)=f(2)*3
f(2)=f(1)*2
f(1)=1
package com.item.demo1Flie;
public class Filedemo2 {
public static void main(String[] args) {
printA();
}
public static void printA(){
System.out.println("A");
printA();//直接调用,没有停止条件,无限。栈溢出
}
}
public class Filedomo3 {
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;//一遍一遍的去往下调用,到最后一步,然后从最后一步开始返回,最终返回1
}
}
4.文件搜索(重要)
package com.item.demo1Flie;
import java.io.File;
/** 文件搜索:**/
public class Filedemo4 {
public static void main(String[] args) {
//目标:完成文件搜索,找到D:盘下的QQ.txt文件的位置。
File dir=new File("D:/");
searchFile(dir,"QQ.txt");
}
public static void searchFile(File dir,String findName){
//1.判断极端情况
if(!dir.exists()|| dir==null||dir.isFile()){
return;//不搜索
}
//2.获取当前目录下的所有一级文件或者文件夹
File[] files=dir.listFiles();
//3.判断当前是否存在一级文件对象,存在才可以遍历
if(files!=null && files.length>0){
//4.遍历一级文件对象
for(File file:files){
//5.判断当前一级文件对象是否是文件
if(file.isFile()){
//6.判断文件名是否相同
if(file.getName().contains(findName)){
System.out.println("找到文件:"+file.getAbsoluteFile());
}
}else{
//7.判断当前文件是否是文件夹
//8.如果是文件夹,则继续递归调用
searchFile(file,findName);
}
}
}
}
}
package com.item.demo1Flie;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
三、字符集
1. 标准ASCII字符串
定义:美国信息交换标准代码,包括了英文、符号等。
标准ASCII使用1个字节存储一个字符,首位是0,因此,总共可表示128个字符。
2.GBK(汉字内码扩展规范,国标)
定义:汉字编码字符集,包含2万多个汉字等字符,GBK中一个中文字符编码成两个字节的形式存储。
注意:GBK兼容了ACII字符集。
GBK规定:汉字的第一个字节的第一位必须是1,汉字占2个字符,英文、数字占1个字节。
3.Unicode字符集(统一码,也叫万国码)
定义:是国际组织制定的,可以容纳世界上所有文字、符号的字符集。
UTF-32:我4个字节表示一个字符。
UTF-8(必须掌握):是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,四个字节。
注意:英文字符、数字等只占1个字节(兼容标准ASCII编码),汉字字符占用3个字节。
UTF-8编码方式(二进制)
- 1字节:0xxxxxxx
- 2字节:110xxxxx 10xxxxxx
- 3字节:1110xxxx 10xxxxxx 10xxxxxx
- 4字节:11110xxx 10xxxxxx 10xxxxxx
注意1:字符编码时,使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码
注意2:英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码。
4.对字符的编码
- byte[] getBytes():指定平台的默认字符集将该String编码为一系列字节,将结果存储到一个新的字节数组中。
- byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中。
5.对字符的解码
- String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String。
- String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String。
代码演示
public class Filedemo5 {
public static void main(String[] args) throws UnsupportedEncodingException {
//编码
String name="我爱国";
byte[] bytes=name.getBytes();//默认平台的UTF-8编码
byte[] bytes1=name.getBytes("GBK"); //指定GBK编码,需要抛出异常
System.out.println(bytes.length);//9
System.out.println(Arrays.toString(bytes));//[-26, -120, -111, -25, -120, -79, -27, -101, -67]
System.out.println(bytes1.length);//6
System.out.println(Arrays.toString(bytes1));//[-50, -46, -80, -82, -71, -6]
//解码
String name1=new String(bytes);
String name2=new String(bytes1,"GBK");
System.out.println(name1);//我爱国
System.out.println(name2);//我爱国
}
}