一、概述
1、File类:文件和目录路径名的抽象表现形式
2、特点:
1)用来将文件或文件夹封装成对象
2)方便于对文件与文件夹的属性信息进行操作,因此是对流操作的一种补充
3)File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变
4)File对象可以作为参数传递给流的构造函数
二、File对象创建
方式一:
File f =new File("a.txt");
将a.txt封装成File对象。可以将已有的和未出现的文件或者文件夹封装成对象。
方式二:
File f2=newFile("c:\\abc","b.txt");
将文件所在目录路径和文件一起传入,指定文件路径。
方式三:
File d=new File("c:\\abc");
File f3=new File(d,"c.txt");
将文件目录路径封装成对象。再创建文件对象。降低了文件于父目录的关联性。
三、File类的常见方法
[Java] 纯文本查看 复制代码
package com.itheima.test01;
import java.io.*;
/*
File 类常见方法
1 创建
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回 false.
和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs(): 创建多级文件夹。
2 删除
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了 返回 false 、
void deleteOnExit() : 在程序退出时删除 指定文件。
3 判断。
boolean exists():文件是否存在
isFile(); 检查文件名是否为正常文件
isDirectory(): 是否是路径(目录)
f.canExecute() 判断文件是否 可执行
isHidden(); 是否为隐藏文件
isAbsolute(): 是否有 绝对路径(目录)
4 获取信息
getName();//获取文件名
getpath(): //获取文件的相对路径(即创建的对象传入的参数是什么就获取到什么)
getParent(); //获取文件父目录。返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
//如果相对路径中有上一层目录,那么该目录就是返回结果。
getAbsolutePath://获取文件的绝对路径
long lastModified() //返回的是 最后一次修改时间
long length//返回文件长度
*/
class FileDemo
{
public static void main(String[] args)throws IOException
{
consMethod();
}
public static void method_5()
{
File f1=new File("file.txt");
File f2=new File("c:\\haha.java");
sop("rename:"+f1.renameTo(f2));
}
public static void method_4()
{
File f=new File("file4.txt");
sop("path:"+f.getPath());//获取相对路径
sop("abspath"+f.getAbsolutePath());//获取绝对路径
sop("parent:"+f.getParent());//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null
//如果相对路径中有上一层目录那么该目录就是返回结果
}
public static void method_3()throws IOException
{
File f =new File("d:\\javalianxi\\day20\\file2.txt");
f.createNewFile();//创建文件
f.mkdir();//创建一级目录
//记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
//通过exists判断
sop("dir:"+f.isDirectory());//返回是否是 文件夹
sop("file:"+f.isFile()); //返回是否是文件
sop("执行:"+f.canExecute());//返回是否可执行
sop(f.isAbsolute());//返回是否是绝对路径
}
public static void method_2()
{
File f=new File("file.txt");
sop("exists:"+f.exists());
sop("execute:"+f.canExecute());
//创建文件夹
File dir=new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");
sop("mkdir:"+dir.mkdirs());//创建多级目录
}
public static void method_1()throws IOException
{
File f=new File("file.txt");
//sop("create:"+f.createNewFile());
//sop("delete:"+f.delete());
}
public static void sop(Object obj)
{
System.out.println(obj);
}
//创建File对象
public static void consMethod()throws IOException
{
//将a.txt封装成file对象。可以将已有的和未出现的文件夹封装成对象。
File f1=new File("a.txt");
File f2=new File("c:\\abc","b.txt");
File d=new File("c:\\abc");
File f3=new File(d,"c.txt");
new File("c:\\abc").mkdir();
f2.createNewFile();//创建新文件
sop("f1:"+f1);
sop("f2:"+f2);
File f4 = new File("c:"+File.separator+"abc"+File.separator+"zzz"+File.separator/*为跨平台目录符号*/+"a.txt");
sop("f3:"+f4);
}
}
5、列出文件及文件过滤
static File[] listRoots();//列出可用的文件系统根目录,即系统盘符
String[] list();
//列出当前目录下所有文件,包括隐藏。调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
String[]list(FilenameFilter filter);
//返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。
//FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。
File[] listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹
File[] ListFiles(FilenameFilterfilter);//返回抽象路径名数组,获取目录中满足指定过滤器的文件或目录。
[Java] 纯文本查看 复制代码
import java.io.*;
class FileDemo2
{
public static void main(String[] args)
{
listRootsDemo();
}
public static void listDemo_1()//建立文件dir关联C盘 之后将C盘文件遍历获取名字和长度
{
File dir=new File("c:\\");
File[] files=dir.listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹
for(File f: files)
{
System.out.println(f.getName()+"::"+f.length());
}
}
public static void listDemo_2()//获取一个目录下所有的.java文件方法
{
File dir = new File("d:\\javalianxi\\day19");
String[] arr=dir.list(new FilenameFilter()//建立匿名内部类,取出末尾为。java的文件
{
public boolean accept(File dir,String name)
{
//System.out.println("dir:"+dir+".....name::"+name);
/*
if(name.endsWith(".java"))
return true;
else
return false;*/
return name.endsWith(".java");//判断文件名是否是以.java结尾
}
});
System.out.println("len:"+arr.length);
for(String name:arr) //遍历数组
{
System.out.println(name);
}
}
public static void listDemo()
{
File f=new File("c:\\abc.txt");
String[]names =f.list();//调用list方法的file对象必须是封装了一个目录。该目录还必须存在
for(String name : names)
{
System.out.println(name);
}
}
public static void listRootsDemo()
{
File[]files =File.listRoots();//列出可用的文件系统根目录,即系统盘符
for(File f:files)
{
System.out.println(f);
}
}
}
四、递归
1.递归打印文件名
[Java] 纯文本查看 复制代码
import java.io.*;
/*
列出指定目录下文件或者文件夹,包括子目录中的内容
也就是列出指定目录下所有内容。
因为目录中还有目录,只要使用同一个列出目录功能的函数完成既可。、
在列出过程中出现的还是目录的话,还可以再次调用本功能,
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归
递归要注意:
1 限定条件
2 要注意递归的次数,尽量避免内存溢出。因为每次调用自身的时候都会先执行下一次调用自己的方法,
所以会不断在栈内存中开辟新空间,次数过多,会导致内存溢出。
*/
class FileDemo3
{
public static void main(String[] args)
{
File dir=new File("d:\\javalianxi\\day18");//关联指定路径
list(dir,0);
}
public static String getLevel(int level)//获取目录为几级目录,目录名前添加" ",显示出层次感
{
StringBuilder sb=new StringBuilder();//建立字符串缓冲区,用来存储空格
while(level>0){
sb.append(" ");
level--;}
return sb.toString();//返回大量空格
}
public static void list(File dir,int level)
{
level++;//定义目录等级,多调用一次,目录等级加1
File files[]=dir.listFiles();////获取本目录下的所以文件和目录的抽象路径
for(int x=0;x<files.length;x++)
{
if(files[x].isDirectory())//判断是否是目录
list(files[x],level);//是目录,则继续遍历文件
else
System.out.println(getLevel(level)+files[x]);//打印出文件名
}
}
}
2.递归删除一个带内容的目录
[Java] 纯文本查看 复制代码
/*
删除一个带内容的目录
删除原理
在windows中,删除目录从里面往外删除的
既然是从里往外删除。就需要用到递归
*/
import java.io.*;
class RemoveDir
{
public static void main(String[] args)
{
File dir=new File("D:\\javalianxi\\day20\\abc - 副本");//关联目录
removedir(dir);//将目录传入
}
public static void removedir(File dir)//删除目录方法
{
File[] files=dir.listFiles();//列出目录下的所以文件和文件夹
for(int x=0;x<files.length;x++)
{
if(files[x].isDirectory())//如果文件是目录
removedir(files[x]);//继续调用本方法
else
System.out.println(files[x].toString()+":-file-:"+files[x].delete());//打印文件名,并删除文件,删除成功返回true
}
System.out.println(dir+"::dir::"+dir.delete());//删除目录
}
}
3.将一个指定目录下的java文件的绝对路径,存储到一个文本文件中
[Java] 纯文本查看 复制代码
/*
练习
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表文件。
思路:
1,对指定的目录进行递归。
2,获取递归过程所以的java文件的路径。
3,将这些路径存储到集合中。
4,将集合中的数据写入到一个文件中。
*/
import java.io.*;
import java.util.*;
class JavaFileList
{
public static void main(String[] args) throws IOException
{
File dir=new File("d:\\javalianxi\\day19");//关联指定目录
List <File>list=new ArrayList<File>();//定义一个List集合,用于存储.java文件的File对象
fileToList(dir,list);//调用获取文件路径方法
File file=new File(dir,"javapath.txt");//指定写入文件
writeToFile(list,file.toString()); //调用写入文件方法,将集合和文件名传入
}
public static void fileToList(File dir,List<File> list)//获取指定文件夹内的所有java文件的绝对路径,并存入集合中
{
File files[]=dir.listFiles();//列出dir路径下的所以文件和目录
for(File file:files) //遍历
{
if(file.isDirectory())//如果是目录,则继续调用本函数
fileToList(file,list);
else
{
if(file.getName().endsWith(".java"))//判断是否是java文件
list.add(file);//是,将文件存入集合中
}
}
}
public static void writeToFile(List<File> list,String javaListFile)throws IOException
{
BufferedWriter bufw=null;//建立字符流缓冲区
try
{
bufw=new BufferedWriter(new FileWriter(javaListFile));//使用字符流缓冲区对象关联写入的文件
for(File f:list)
{
String path=f.getAbsolutePath();//获取绝对路径
bufw.write(path);//写入
bufw.newLine();//换行
bufw.flush();//刷新
}
}
catch (IOException e)
{
throw e;
}
finally
{
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw e;
}
}
}
}
4.键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中,每种类型的文件及个数
[Java] 纯文本查看 复制代码
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/*
* 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中,每种类型的文件及个数,
*/
public class Test03 {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
Scanner sc = new Scanner(System.in);
System.out.println("请输入要查询的路径");
String fileName = sc.nextLine();
File f = new File(fileName);
count(f,map);
Set<String> keys = map.keySet();
//遍历所有的丈夫
for (String key : keys) {
//让每个丈夫去找他自己的媳妇就可以了
int value = map.get(key);
System.out.println( key + "---" + value);
}
}
public static void count(File file ,Map<String,Integer> map){
if(file.isDirectory()){
File[] files = file.listFiles();
for (File file2 : files) {
if(file2.isFile()){
String name = file2.getName().substring(file2.getName().lastIndexOf(".")+1);
if(map.containsKey(name)){
int num = map.get(name)+1;
map.put(name, num);
}else{
map.put(name, 1);
}
}else{
count(file2,map);
}
}
}
}
}