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 |