系列文章目录
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.文件字符输出流
总结
学会使用对文件的基本操作和文件的字节流和字符流