对文件的操作从本质上和前面解析的各种类有着本质的区别。前面所有类的操作都是基于计算机的内存,只要断电,所有数据都消失。而对于文件来讲,计算机是储存在磁盘上。
先来简单的说说内存和磁盘(硬盘),因为这会在文件读写的速度上有着很大的影响。首先要说内存和硬盘都用来储存数据的,但是为什么还有区分成两者呢?大家都应该知道,计算机本身的操作都是靠着电路实现的,cpu对于电的操作反应速度是很快的,内存其实就是电路组成,这样会使得cpu对于内存的反应操作的速度巨快,但是也会带来一个问题,只要断电,所有在内存上的数据都会消失,这也就是大家平时在写文档时,没有立即保存电脑强制关机重启后,文档内未保存的内容全部消失的原因。正是因为内存会出现这种问题,所有提出了磁盘,也就是硬盘。硬盘是由磁组成的,上面存着都是磁信号(南北极也是两种状态可以代替电路的通断两种状态表示0和1)。大家看到的C盘多少个G,D盘多少G,都是指磁盘。因为上面是磁性号,这样断电之后,所有的数据都是保存下来的。但是硬盘有一个问题,就是因为它是磁信号,cpu必须得先将电信号转换为磁信号才能刻录在磁盘上,这也就意味着cpu对于磁盘的处理速度远远慢与磁盘。我们现在对于电脑的操作,基本上都是先在内存上处理部分数据后再储存在硬盘上。
上面说简单的阐述了一下自己对于磁盘和硬盘的理解后,再来说说java对于文件的处理。
java说一切皆对象,那么每一个文件就是一个对象。
java.io.File就是文件类。
使用File可以:
1.访问文件或目录的属性(如:大小,名字,修改时间等)
2.操作文件或目录(创建,删除文件和目录)
3.访问目录中的所有内容
**但是不可以: 访问文件数据(即对文件的读写)**
File类的**注意事项**:
1.**文件路径的书写**(见构造方法)
2.file.delete()**只能删除空目录**(见demo5)和**不为空的目录删除**(见demo8)(**递归**)
3.file.mkdir()和dir.mkdiers()的区别(见demo5)(**file.mkdir()为创建一个目录,其他所有父目录必须存在,dir.mkdiers()方法在创建当前目录的同时将多有不存在的父目录一并创建出来**)
4.**获取一个目录下的部分子项**(获取满足条件的部分子项)**需要用到FileFilter接口及重写其过滤器方法accept()**见demo8
构造方法
File file=new File("."+File.separator+"demo.txt");
这里需要注意,构造方法传入的参数是文件的路径,但是这里**尽量不要写绝对路径**,因为不同操作系统之间绝对路径存在着很大的差别(例如:Windows系统有各种盘符(C盘D盘等),而Linux系统只有一个根目录,没由盘符),这就会导致在不同操作系统之间移植的时候,会各种报错,这也就失去了java的优势。所以在写路径时,**尽量去写相对路径而不是绝对路径**,这样就可以保证在不同操作体统间移植的时候不会报错。除了这一点,在写路径时,**尽量不要去写当前系统的分离器**(例如Windows系统路径C:\XAMPP\htdocs,这其中的\就是Windows系统的分离器),不同操作系统之间的分离器也不同,我们在写代码时,**不要写\,而应该写成File.separator**,这是File类的一个成员变量,表示当前系统的分离器。当你移植到不同操作系统时,不同的虚拟机会自动帮你匹配。
这个类的方法有很多
例如:
demo1
File file=new File("."+File.separator+"demo.txt");
//获取名字
String name=file.getName();
System.out.println("name:"+name);
//大小(占用的字节量)
long lenth=file.length();
System.out.println("大小:"+lenth+"字节");
//是否为文件
boolean isFile=file.isFile();
System.out.println("是文件:"+isFile);
//是否为目录
boolean isDir=file.isDirectory();
System.out.println("是目录:"+isDir);
//是否问隐藏文件
boolean isHidden=file.isHidden();
System.out.println("是否为隐藏文件"+isHidden);
//最后修改时间
long time=file.lastModified();
Date date=new Date(time);
System.out.println(date);
在当前项目根目录下创建test.txt文件。
demo2
File file=new File("text.txt");
/**
* boolean exists()
*判断当前File表示的文件或目录是否已经存在了
*/
if(!file.exists()){
file.createNewFile();
System.out.println("创建完毕");
}
删除当前目录下的test.txt
demo3
File file=new File("test.txt");
if(!file.exists()){
file.delete();
System.out.println("删除完毕!");
}else{
System.out.println("该文件不存在");
}
在当前目录下创建一个名为demo的目录
demo4
File dir=new File("demo");
if(!dir.exists()){
//创建该目录
dir.mkdirs();
System.out.println("创建完毕");
}else{
System.out.println("该目录已存在");
}
在当前目录下创建目录:多级目录 a/b/c/d/e/f
demo5
File dir=new File("a"+File.separator+
"b"+File.separator+
"c"+File.separator+
"d"+File.separator+
"e"+File.separator+
"f");
if(!dir.exists()){
/**
* dir.mkdir()方法不能创建多级目录,它只可以创建一个目录,
* 其他所有父目录必须存在
*
* 要创建多级目录就得使用dir.mkdiers()方法
* 在创建当前目录的同时将多有不存在的父目录一并创建出来。
*/
dir.mkdirs();
System.out.println("创建完毕!");
}else{
System.out.println("目录已存在");
}
删除目录
demo6
File dir=new File("demo");
if(dir.exists()){
/*
* 删除目录必有一个要求,该目录必须是一个
* 空目录才可以将其删除
* (比如将demo目录改成a目录(因为a目录下还有目录))
*/
dir.delete();
System.out.println("删除完毕!");
}else{
System.out.println("该目录不存在");
}
获取当前目录下的所有子项 (是一个list文件集合)
demo7
File dir=new File(".");
/*
* File[] listFiles()
* 获取当前目录下的所有子项
*/
File[] subs=dir.listFiles();
//遍历
for(File sub:subs){
if(sub.isFile()){
System.out.print("文件:");
}else{
System.out.print("目录:");
}
System.out.println(sub.getName());
}
获取当前目录下名字以“.”开头的子项(需要用到接口FileFilter的accept过滤器方法(重写))
demo8
File dir=new File(".");
/*
* 重载的listFiles方法会将所有子项都经过一次过滤器
* 但是该方法只会讲满足过滤器accept方法的子项返回
*/
File[] subs=dir.listFiles(new MyFilter());
for(File sub:subs){
String name=sub.getName();
System.out.println(name);
}
System.out.println("************");
/*
* 使用匿名内部类形式创建一个获取当前(目录下的所有文件)的过滤器
*/
File[] subss=dir.listFiles(new FileFilter(){
@Override
public boolean accept(File file) {
return file.isFile();
}
});
for(File sub:subss){
System.out.println(sub.getName());
}
.......
class MyFilter implements FileFilter{
@Override
public boolean accept(File file) {
//过滤条件:名字是以“.”开头
String name=file.getName();
System.out.println("正在过滤"+name);
return name.startsWith(".");
}
}
目录下面还有多级子目录的删除(使用递归层级删除)
demo9
//删除文件
public static void f(File dir){//递归
if(dir.isFile()){//如果是文件直接删除
System.out.println(dir.getName());
dir.delete();
}
//如果是目录
File[] dirs=dir.listFiles();
if(dirs.length==0){//当前目录没有子项直接删除
System.out.println(dir.getName());
dir.delete();
}
//如果有子项,每个子项递归
for(File file:dirs){
f(file);
System.out.println(dir.getName());
dir.delete();
}
}
public static void main(String[] args) {
File dir=new File("a");
f(dir);
System.out.println("删除完毕");
}
以上就是所有对于File的总结