目录
(3)字节缓冲输入流:BufferedInputStream
(4)字节缓冲输出流:BufferedOutputStream
一、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()</ |