- I/O相关—> 输入/输出 流(数据流动)
- 数据流动的方向:读数据(输入Input) ;写数据(输出output)
- 文件流;;字符流;对象流;网络流…
- 什么叫文件
- 一种电脑的存储形式;
- 文件有不同的格式 : .txt .doc .ppt .mp4 .jpg .rar …
- 文件夹?----目录,路径 , 不算文件
- File----->与电脑上的文件或文件夹产生一一对应的映射关系
- 什么叫文件流?做什么?
读取文件中的内容 向文件中写内容
文件输入流 文件输出流
字节型文件输入流 字节型文件输出流
字符型文件输入流 字符型文件输出流
一.File类
- java.io包中
- 文件或目录路径名的抽象表示形式
- File与真实硬盘中的文件或文件夹,不是一个东西
File是在内存中的一个对象<—映射—>硬盘上的文件或文件夹 - File类中的常用的方法:
- (1)
File file = new File("D://test//test.txt");
通过路径构造对象,test是真实存在的。
如果文件不是真实存在的:File file = new File("D://test//b.txt");
file对象 是真正的文件么? 不是
file对象 堆内存中 创建出来的一个对象空间
路径是看创建的对象 是否能与硬盘中的一个真实文件产生对应映射关系
所以虽然文件不存在,但是并不影响我们创建对象,只不过映射关系不存在而已,因为硬盘上没有那个文件。
- (2)
canRead()
;canWrite()
;isHidden()
;isFile()
;isDirectory()
;
System.out.println(file.canExecute()); //是否可执行
System.out.println(file.canRead()); //文件是否可以打开,可读
System.out.println(file.canWrite()); //是可写
System.out.println(file.isHidden()); //文件是否隐藏
System.out.println(file.isFile());//判断当前的file是否是一个文件
System.out.println(file.isDirectory());//判断当前的file是否是一个目录(文件)
- (3)
length()
获取文件中字节的个数:
long l = file.length();
- (4)
lastModified()
获取文件最后的修改时间—>毫秒值
long time = file.lastModified();//获取文件最后修改时间
Date date = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd KK:mm:ss");
System.out.println(sdf.format(date));
- (5)
String path = getAbsolutePath()
获取文件的绝对路径 :D://test//Test.txt
String name = getName()
获取文件的名字:Test.txt
File file = new File("E:\\test\\Test.txt");
String name = file.getName();
//文件的名字 Test.txt
String path = file.getAbsolutePath();
//文件的绝对路径 D://test//Test.txt
System.out.println(name);
System.out.println(path);
绝对路径<---->相对路径
绝对路径可以通过完整的字符串 定位盘符 文件夹 文件
相对路径没有盘符的写法 当前工程(项目)所在的位置找寻
- (6)
boolean = createNewFile()
创建新的文件
//创建一个file对象
File file = new File("D://test//abc.txt");
//通过这个对象 回头在硬盘上 创建文件
//必须处理异常 才能file.createNewFile(),因为你要创建文件,盘符写错,就失败了,所以一定处理异常
try {
boolean value = file.createNewFile();//编译时异常
System.out.println(value);
} catch (IOException e) {
e.printStackTrace();
}
boolean = mkdir
:创建新的文件夹 , 外层没有,不能创建
boolean = mkdirs
:创建新的文件夹 外层没有 可以自动创建
//创建一个新的file对象
File file = new File("D://test//bbb/inner");
//在硬盘上 创建一个新的文件夹
//boolean value = file.mkdir();//外层(父元素)需要真实存在
boolean value = file.mkdirs();//可以创建文件夹, 如果外层没有 也会同时创建
System.out.println(value);
- (7)
String pname = getParent()
:获取当前file的父亲file名字
File file = getParentFile()
: 获取当前file的父亲file对象
String[] names = list()
:获取当前file的所有儿子名字
File[] files = listFiles()
:获取当前file的所有儿子对象
File file = new File("D://test//aaa");
//数组对象为空 证明当前的file是一个文件
//数组对象不为空 证明当前的file是一个文件夹
//数组对象的长度不为0 证明当前的file是一个不为空的文件夹 文件夹内有元素
File[] files = file.listFiles();
System.out.println(files.length);
- (8)
boolean = delete()
删除文件(任何一个文件)或空的文件夹 ,不能删除带元素的文件夹。
常用方法:
canRead; canWrite ; isHidden ;length ; lastModifered ; isFile ;isDirectory;
getAbsolutePath() ; getName()
绝对路径—相对路径(工程的根目录去找)
createNewFile() ; mkdir(); mkdirs();
File = getParentFile() ; getParent()
File[] = listFiles() ; list();
delete();
二. 文件夹遍历删除(递归)
- 文件夹的遍历----需要一个递归
看看文件夹中有什么。
普通函数的调用:
public void testOne(){
this.testTwo();
System.out.println("我是testOne方法");
}
public void testTwo(){
this.testThree();
System.out.println("我是testTwo方法");
}
public void testThree(){
System.out.println("我是testThree方法");
}
public static void main(String[] args){
//加载TestMethod类的过程
TestMethod tm = new TestMethod();
tm.testOne();//调用testOne让其执行一遍--->栈内存中 临时
}
/*
我是testThree方法
我是testTwo方法
我是testOne方法
*/
执行思想:主方法中执行这句代码
tm.testOne();
,testOne方法中的第一句是调用了testTwo方法,所以先执行testTwo方法,testTwo方法的第一句又是执行testThree方法,所以先执行testThree方法,输出我是testThree方法
,相当于testThree方法执行完毕,等于testTwo中的第一句this.testTwo();
执行完毕,执行第二句:System.out.println("我是testTwo方法");
,输出我是testTwo方法
,至此testTwo方法执行完毕,等于testOne中的this.testTwo();
这句代码执行完毕,执行下一句System.out.println("我是testOne方法");
输出我是testOne方法
内存当中的执行过程:
首先默认方法区中加载类模板;类模板有三个方法。
new TestMethod();
堆内存中加载类模板。
TestMethod tm
栈内存中申请空间tm,指向堆内存的类模板。
tm.testOne();
调用testOne让其执行一遍—>栈内存中,临时开辟一块红色空间。
第一件事调用testTwo方法,所以临时给testTwo开辟蓝色空间,但是由于testOne还没有执行完毕,所以空间没有释放。
然后testTwo方法调用testThree方法,蓝色调用紫色,所以又开辟了紫色空间。
循环和递归:
循环:
// 设计一个方法 描述盖宝塔
public void buildTower(int floor){//5
for(int i=1;i<=floor;i++){
System.out.println("盖到第"+floor+"层宝塔啦");
}
}
递归:
//递归的想法
// 想让我做事(盖第五层) 我要求让别人把之前的事情做完
// 1.让别人先做事
// 2.我自己做事
public void buildTower(int floor){//5
//判断当前floor是否为1 若不是找一个别人先盖之前层
if(floor>1){
this.buildTower(floor-1);
}
//我自己做事
System.out.println("盖到第"+floor+"层宝塔啦");
}
递归盖宝塔的过程:
方法区先加载类模板。new一个对象,在堆内存中。栈内存中tm指向堆内存的类模板,调用方法让方法执行,在栈内存中开辟临时空间。先判断5>1 调用,然后自己的执行的先等一下。调用就在开辟一个小空间,4>1 ,调用,自己的执行,也在等一下,以此类推,1>1不满足,执行自己的方法,输出1层,相当于2的调用执行完毕,可以执行2自己的输出2层,表示3的调用执行完毕,可以执行3 的自己的输出了,输出3层,等于4的调用执行完毕,可以执行4自己的输出,表示的5调用执行完毕,可以执行5的调用自己的输出,输出5层。
遍历文件的代码:
//设计一个方法 用来展示(遍历)文件夹
// 参数-->file(代表文件或文件夹)
public void showFile(File file){//D://test文件夹
//判断如果file是一个文件夹 文件夹内有元素 找一个人先做
//获取file的子元素 files==null是个文件 files!=null是个文件夹 files.length!=0是一个带元素的文件夹
File[] files = file.listFiles();//test文件夹所有子元素
if(files!=null && files.length!=0){
for(File f:files){//每一个子元素都找人遍历
this.showFile(f);//循环第一次 test文件夹中的aaa 循环第二次 test->bbb 循环第三次 Test.txt
}
}
//做自己的显示(file是文件或file是一个空的文件夹)
System.out.println(file.getAbsolutePath());
}
public static void main(String[] args){
NewTestFile ntf = new NewTestFile();
File file = new File("D://test");
ntf.showFile(file);
}
运行过程:
红色是执行过程。
- 文件夹的删除----需要一个递归
//设计一个方法 删除文件夹
// 参数 file
public void deleteFile(File file){
//判断file不是空文件夹 找人先做事
File[] files = file.listFiles();
if(files!=null && files.length!=0){
for(File f:files){
this.deleteFile(f);
}
}
//删除file (file是个文件或file是一个空文件夹)
file.delete();
}
public static void main(String[] args){
NewTestFile ntf = new NewTestFile();
File file = new File("D://test");
ntf.deleteFile(file);
}