1 概述
IO流,流对象,只能操作设备上的数据,其他的都操作不了。
文件夹,文件的属性(文件的创建,修改,读写属性,文件名等),这些需要用 File类来操作。
File类
用来将文件或者文件夹(目录) 封装成对象
文件一旦变为对象,可以先操作文件,再操作文件中的数据
方便对文件或者文件夹的属性信息进行操作
File对象可以作为参数,传递给流的构造函数
文件一旦变为对象,可以先操作文件,再操作文件中的数据,可以将一个已存在的,或者不存在的 文件或者目录 封装成 File对象
几个构造函数
File(String pathname)
通过 将给定路径 名字字符串 转换为抽象路径名 来创建一个 新File实例
例:File f1 = new File("c:\\a.txt");
// 想把谁封装成对象,把谁往里写就可以了
File(String parent, String child) File(File parent, String child)
根据 parent路径名 字符串 和 child路径名 字符串,创建一个 新File实例
例:File f2 = new File("c:\\","a.txt");
File( URI uri )
通过 将给定的 file: URI 转换为一个 抽象路径名 来创建一个 新的File实例
File类的功能主要分为5种:获取,创建与删除,判断,重命名,过滤器,下面分别讲解
2 获取
2.1 获取 File类 本身的属性
获取 File类 本身的属性,包括,获取文件名称,文件路径,文件大小,文件修改时间等
File f = new File("G:\\test\\GestureTest\\a.txt");
String name = f.getName();
String absPath = f.getAbsolutePath(); // 绝对路径
String path = f.getPath();
long len = f.length(); // 文件的大小
long time = f.lastModified(); // 文件上次的修改时间
// 打印出来的时间是 1336102144203 怎么把它变为有效的时间
Date date = new Date(time); // 先把时间封装
// 把时间 格式化
DateFormat dateFormate = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String str_time = dateFormate.format(date);
// 怎么判断文件有没有被改写,判断文件上次修改时间
// 单独开辟一条线程,监控文件的修改时间,一旦文件修改,就重新读取文件的内容
System.out.println("parent:"+ f.getParent()); // getParent() 获取父目录
System.out.println("name:"+name);
System.out.println("absPath:"+absPath);
System.out.println("path:"+path);
System.out.println("len:"+len);
System.out.println("time:"+time);
输出结果
parent:G:\test\GestureTest
name:a.txt
absPath:G:\test\GestureTest\a.txt
path:G:\test\GestureTest\a.txt
len:35
time:1537322126301
2.2 获取系统根目录和容量
static File listRoots()
列出可用的文件系统根
private static void getListRoots() {
File[] files = File.listRoots();
for(File file:files){
System.out.println(file); // 这个打印电脑根目录 C:\ D:\ E:\ F:\ G:\
}
File file = new File("G:\\");
System.out.println("getFreeSpace:"+file.getFreeSpace()); // 常用
System.out.println("getTotalSpace:"+file.getTotalSpace());
System.out.println("getUsableSpace:"+file.getUsableSpace());
}
输出结果:
C:\
D:\
E:\
F:\
G:\
getFreeSpace:32711270400
getTotalSpace:161060220928
getUsableSpace:32711270400
2.3 获取指定目录全部文件
如果现在给出了一个目录,则可以直接列出目录中的内容。列出的方法在File类中存在两个:
- 以字符串数组的形式返回:public String[] list()
- 以File数组的形式返回:public File[] listFiles()
分别演示如下:
public String[] list() ,以字符串数组的形式返回,列出了全部的名字,包括文件夹得名字和文件的名字
private static void getList() {
File f = new File("G:"+ File.separator);
String[] str = f.list();
for(String s:str){
System.out.println(s);
}
}
输出结果:
$RECYCLE.BIN
a
app
cpcopy
demo
exerise
JAVA
Javaex
JAVA视频
jdk
jing
Jlex
... ...
public File[] listFiles(),以File数组的形式返回,列出了全部路径
private static void getlistFiles() {
File f = new File("G:"+File.separator);
File[] files = f.listFiles();
for(File file:files){
System.out.println(file);
}
}
输出结果:
G:\$RECYCLE.BIN
G:\a
G:\app
G:\cpcopy
G:\demo
G:\exerise
G:\JAVA
... ...
3 创建与删除
文件的创建与删除,方法的返回类型是 boolean类型
// 文件的创建和删除
File file = new File("file.txt");
// 和输出流不一样,如果文件不存在,则创建,如果文件存在,则不创建
boolean b = file.createNewFile();
System.out.println("b="+b);
boolean b = file.delete();
System.out.println("b="+b);
// 文件夹的创建与删除
File dir = new File("abc\\q\\e\\c\\z\\r\\w\\y\\f\\e\\g\\s"); //创建多级目录
boolean b = dir.mkdir();//make directory // 创建单级目录
dir.mkdirs(); //创建多级目录
System.out.println(dir.delete()); // 文件夹的删除
System.out.println(dir.delete()); // 文件夹的删除
说明:
windows的删除是从里往外删的,如果文件夹里有内容,直接删除,是删不掉的
如果文件夹里没有内容,直接删可以删掉
对于多级目录,使用 delete()方法,返回true,最里面的 s 被删除掉
如果文件正在被流所操作,同样也是删不掉
4 判断
我们若想操作一个文件,就要先判断这个文件存不存在
File f = new File("a.txt");
boolean b = f.exists();
System.out.println("b="+b); // --- 判断一个文件是否存在的代码
File f = new File("aaa");
f.mkdir(); // 执行完这句,建立一个名为 aaa.txt的文件夹
File f = new File("aaa");
f.createNewFile(); // 建立一个文件
aaa不一定是目录,a.txt 也不一定是文件
所以如果文件未知,在操作前,先判断一下是否存在
File f=new File("d:"+File.separator+"test.txt");
if(f.exists()){
// 进行操作
}else{
try {
f.createNewFile(); // 不存在,就创建文件
} catch (IOException e) {
e.printStackTrace();
}
}
}
5 重命名
如果在同一个目录下,是重命名,如果不在同一目录下,是剪切
public static void renameToDemo() {
File f1 = new File("c:\\9.mp3");
File f2 = new File("d:\\aa.mp3");
boolean b = f1.renameTo(f2);
System.out.println("b="+b);
}
6 过滤器
常用方法
String[] list( FilenameFilter filter )
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中,满足指定过滤器的文件和目录
FilenameFilter --- 接口
原理
过滤器,第一步做的,还是先调用 list,把这个 list下,所有目录都拿到,然后遍历数组,只要符合自己创建的
FilenameFilter.accept(dir, name);
,只要返回true,就把符合条件的 内容 往数组里存
代码实例1
// 过滤器 --- 找发非隐藏文件
public class FilterByHidden implements FileFilter {
public boolean accept(File pathname) {
return !pathname.isHidden();
}
}
private static void hiddenFile() {
File f = new File("C:\\");
File[] files = f.listFiles(new FilterByHidden());
for(File file: files){
System.out.println(file);
}
}
输出结果
C:\AppData
C:\BluetoothExchangeFolder
C:\dlcache
C:\Documents and Settings
C:\inetpub
C:\Intel
C:\MiFlashvcom.ini
C:\PerfLogs
C:\Program Files
C:\Program Files (x86)
C:\SWSETUP
C:\unintall.log
C:\Users
C:\WiFi_Log.txt
C:\Windows
代码实例2 专门用于过滤后缀名的过滤器
public class SuffixFilte implements FilenameFilter {
private String suffix ; // 我要过滤什么,不知道,你传什么,我过滤什么
public SuffixFilte(String suffix) {
super();
this.suffix = suffix;
}
public boolean accept(File dir, String name) {
return name.endsWith(suffix);
}
}
private static void txtFile() {
File f = new File("C:\\");
File[] files = f.listFiles(new SuffixFilte(".txt"));
for(File file: files){
System.out.println(file);
}
}
输出结果:
C:\WiFi_Log.txt