一 File类
1 概述
IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件
File:文件和目录(文件夹)路径名的抽象表示形式
2 构造函数
A:File file = new File("e:\\demo\\a.txt");
B:File file = new File("e:\\demo","a.txt");
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
C:File file = new File("e:\\demo");
File file2 = new File(file,"a.txt");
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
// 把e:\\demo\\a.txt封装成一个File对象
3 File类的功能(以后用多了就都熟了)
A:创建功能
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
File file = new File("e:\\demo");
System.out.println("mkdir: " + file.mkdir());
File file2 = new File("e:\\demo\\a.txt");
System.out.println("creatNewFile: " + file2.creatNewFile());
File file7 = new File("e:\\abc\\abc\\abc");
System.out.println("mkdirs: " + file7.mkdirs());
File file8 = new File("e:\\liuyi\\a.txt");
System.out.println("mkdirs: " + file8.mkdirs());
B:删除功能
public boolean delete()
File file3 = new File("e:\\buf.txt");
System.out.println(file3.delete());
File file4 = new File("e:\\abc\\abc");
System.out.println(file4.delete());
Java中的删除不走回收站。
要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
C:重命名功能
public boolean renameTo(File dest)
File file = new File("e:\\林青霞.jpg");
File newFile = new File("e:\\东方不败.jpg");
System.out.println("renameTo:" + file.renameTo(newFile));
D:判断功能(感觉这个最常用了,递归的时候会用)
* public boolean isDirectory():判断是否是目录
* public boolean isFile():判断是否是文件
* public boolean exists():判断是否存在
* public boolean canRead():判断是否可读
* public boolean canWrite():判断是否可写
* public boolean isHidden():判断是否隐藏
E:获取功能(也很常用)
* public String getAbsolutePath():获取绝对路径
* public String getPath():获取相对路径
* public String getName():获取名称
* public long length():获取长度。字节数
* public long lastModified():获取最后一次的修改时间,毫秒值
F:高级获取功能(很常用)
* public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
* public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
G:过滤器功能
如案例1的第二种方法所示
二 案例
A:输出指定目录下指定后缀名的文件名称
File file = new File("e:\\");
File[] files = file.listFiles();
for(File f: files){
if(f.isFile()){
if(f.getName().endsWith(".jpg")){
System.out.println(f.getName());
}
}
}
很简单的,还有另一种方法,用的是过滤器
* public String[] list(FilenameFilter filter)
* public File[] listFiles(FilenameFilter filter)
public static void main(String[] args) {
File file = new File("e:\\");
String[] strArray = file.list(new FilenameFilter(){
public boolean accept(File dir, String name){
// 到底把这个文件或者文件夹的名称加不加到数组中,取决于这里的返回值是true还是false
return new File(dir, name).isFile() && name.endsWith(".jpg");
}
});
for(String s: strArray){
System.out.println(s);
}
}
B:批量修改文件名称
// E:\评书\三国演义\三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi
// 改后:E:\评书\三国演义\001_桃园三结义.avi
public static void main(String[] args) {
File srcFolder = new File("E:\\评书\\三国演义");
File[] fileArray = srcFolder.listFiles();
for (File file : fileArray) {
String name = file.getName();
int index = name.indexOf("_");
String numberString = name.substring(index + 1, index + 4);
int endIndex = name.lastIndexOf('_');
String nameString = name.substring(endIndex);
String newName = numberString.concat(nameString);
File newFile = new File(srcFolder, newName);
file.renameTo(newFile);
}
}
C:递归删除带内容的目录(递归)
* 自己之前写的,细节处有点问题,所以还是用了老师的代码
public static void main(String[] args) {
File file = new File("e:\\abc");
deleteFolder(file);
}
public static void deleteFolder(File file){
File[] files = file.listFiles();
if(files != null){
for(File f: files){
if(f.isFile()){
System.out.println(f.getName() + " " + f.delete());
}else{
deleteFolder(f);
}
}
System.out.println(file.getName() + " " + file.delete());
}
}
D:把E:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台(递归)
public static void main(String[] args) {
File file = new File("E:\\java 2015\\2015年Java基础视频_深入浅出精华版(风清扬)\\day20\\code\\day20_DiGui\\src\\cn");
getAllJavaFilePaths(file);
}
public static void getAllJavaFilePaths(File srcFolder){
File[] files = srcFolder.listFiles();
if(files != null){
for(File f: files){
if(f.isDirectory()){
getAllJavaFilePaths(f);
}else{
if(f.getName().endsWith("java")){
System.out.println(f.getPath());
}
}
}
}
}
案例C和D都是只要掌握了递归的方式遍历文件,无论要求怎么变,都可以做了