19 File对象
19.1 File对象
File对象的作用:File对象将一个已存在或不存在的文件或文件夹进行了封装成对象,方便对文件和文件夹的操作。File对象还可以作为参数,传递给流的构造函数。
19.2 File对象的常用方法
1,获取
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args)throws IOException{
File file=new File("d:\\a.txt");//将指定路径的文件封装在File对象中
demo_1(file);
}
public static void demo_1(File file)throws IOException {
System.out.println(file.getName());//获取文件名 :a.txt
System.out.println(file.getPath());//获取路径
System.out.println(file.getCanonicalPath());//获取相对路径
System.out.println(file.getAbsolutePath());//获取绝对路径
System.out.println(file.length());//获取文件大小,多少字节
System.out.println(file.lastModified());//获取文件最后一次修改时间
System.out.println(file.getParent());//获取父目录。
System.out.println(file.getFreeSpace());//获取文件或文件夹所在分区的空闲字节数。
System.out.println(file.getTotalSpace());//获取文件或文件夹所在分区的总字节数。
System.out.println(file.getUsableSpace());//获取文件或文件夹所在分区的可用字节数
File[] disks=file.listRoots();//;获取系统盘符。
}
}
2.创建与删除
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args)throws IOException{
File file=new File("d:\\a");//将指定路径的文件封装在File对象中
demo_2(file);
}
public static void demo_2(File file)throws IOException {
file.createNewFile();//按照File中封装的路径和文件名,创建一个新文件。如果文件不存在,则创建,存在则不创建
file.delete();//删除文件。
file.mkdir();//创建目录
file.mkdirs();//创建多级目录。
}
}
注意:delete()方法,如果是单独的文件调用,可以删除文件,如果是封装了目录的File对象调用此方法,目录必须是空的,才能够删除目录,否则不能删除目录。对于封装了多级目录的File对象,调用此方法,只能删除一个最底层子目录。
3.判断
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args)throws IOException{
File file=new File("d:\\a");//将指定路径的文件封装在File对象中
demo_3(file);
}
public static void demo_3(File file)throws IOException {
System.out.println(file.isAbsolute());//判断File的文件或文件夹是否是绝对路径。
System.out.println(file.isDirectory());//判断File封装的是否是文件夹。
System.out.println(file.isFile());//判断File封装的是否是文件。
System.out.println(file.isHidden());//判断File对象是否是隐藏属性。
System.out.println(file.exists());//判断文件或文件夹是否存在。
}
}
4,文件及文件名过滤器。
String[] | list() |
String[] | list(FilenameFilter filter) |
File[] | listFiles() |
File[] | listFiles(FileFilter filter) |
File[] | listFiles(FilenameFilter filter) |
注意:调用以上方法的File对象中封装的必须是目录,否则会发生:NullPointerException异常。
FilenameFilter和FileFileter都是接口,定义的是文件过滤的规则。自定义类实现这两个接口,并覆盖其各自的accept()方法,就可以完成自定义过滤器。
过滤器的作用:通过文件过滤器和文件名过滤器可以获取与自定义条件相符合的文件或文件夹。
如:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class FileDemo {
public static void main(String[] args){
File file=new File("d:\\");//将指定路径的文件封装在File对象中
//使用匿名内部类,自定义文件过滤器和文件名过滤器。
FileFilter filter1=new FileFilter(){
@Override
publicboolean accept(File file) {
return file.isHidden();//过滤隐藏属性的文件。
}};
FilenameFilter filter2=new FilenameFilter(){
@Override
publicboolean accept(File dir, String name) {
return name.endsWith(".txt");//过滤.txt扩展名的文件
}
};
File [] files=file.listFiles(filter1);//通过过滤器,获取文件
for(File f:files){
System.out.println(f.getName());
}
File [] dirs=file.listFiles(filter2);//通过过滤器,获取文件
for(File f:dirs){
System.out.println(f.getName());
}
}
}
5,递归
递归是一种编程手法,函数自身间接或直接调用了自身,就是递归。
什么时候用递归?
当函数被重复调用,且前一次执行的结果和后一次执行的结果有关系,就可以使用递归。
使用递归要注意:
1,必须有明确的条件,否则会抛出异常。
2,要控制递归的次数。
如:遍历d盘下所有的文件包括子目录中的文件。
import java.io.File;
public class FileDemo {
public static void main(String[] args){
File dir=new File("d:\\");
getFiles(dir);
}
public static void getFiles(File dir) {
File[] files=dir.listFiles();//列出D盘下所有的文件。
for(File f:files){//遍历文件数组
if(f.isDirectory())//判断条件,如果是目录就继续遍历。
getFiles(f);//使用递归进行目录的深度遍历
else
System.out.println(f.getAbsolutePath());//打印文件的绝对路径。
}
}
}
练习:
1, 获取d盘下的文件夹。
import java.io.File;
public class FileDemo {
public static void main(String[] args){
File dir=new File("d:\\");
getFiles(dir);
}
public static void getFiles(File dir) {
File[] files=dir.listFiles();//列出D盘下所有的文件。
for(File f:files){//遍历文件数组
System.out.println(f.getName());
}
}
}
2,获取d盘下所有的.txt文件,包括子目录中的。
import java.io.File;
import java.io.FilenameFilter;
public class FileDemo {
public static void main(String[] args){
File dir=new File("d:\\");
FilenameFilter filter=new FilenameFilter(){//自定义过滤器。
@Override
publicboolean accept(File dir, String name) {
return name.endsWith(".txt");
}};
getFiles(dir,filter);
}
public static void getFiles(File dir,FilenameFilter filter) {
File[] files=dir.listFiles();//列出D盘下所有的文件。
for(File f:files){//遍历文件数组
if(f.isDirectory())//判断是否是目录
getFiles(f,filter);//如果是目录,就递归,进行深度遍历。
if(filter.accept(f, f.getName())){//通过过滤器进行判断
System.out.println(f.getName());//打印过滤的文件名
}
}
}
}
3, 将d盘下的所有.java文件,复制到e盘TXT目录下,并改名为.txt.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args){
File dir=new File("d:\\");
FilenameFilter filter=new FilenameFilter(){//自定义过滤器。
@Override
publicboolean accept(File dir, String name) {
return name.endsWith(".java");
}};
File dstdir=new File("e:\\TXT");//创建目标目录
BufferedInputStream bis=null;//初始化字节输入流
BufferedOutputStream bos=null;//初始化字节输出流。
getFiles(dir,filter,bis,bos,dstdir);
}
public static void getFiles(File dir,FilenameFilter filter,BufferedInputStream bis,BufferedOutputStream bos,File dstdir) {
if(!dstdir.exists())
dstdir.mkdir();
File[] files=dir.listFiles();//列出D盘下所有的文件。
for(File f:files){//遍历文件数组
if(f.isDirectory())//判断是否是目录
getFiles(f,filter,bis,bos,dstdir);//如果是目录,就递归,进行深度遍历。
if(filter.accept(f, f.getName())){//通过过滤器进行判断
String dstfilename=f.getName().replaceAll("\\.java$","\\.txt");//对文件名替换。
File dstfile=new File(dstdir,dstfilename);//更改过的文件,封装到目标文件夹中。
byte[]buf=newbyte[1024];
int len=0;
try {
bis=new BufferedInputStream(new FileInputStream(f));//输入流关联被过滤的文件
bos=new BufferedOutputStream(new FileOutputStream(dstfile));//输出到目标目录。
while((len=bis.read(buf))!=-1){
bos.write(buf,0,len);//写入目标文件目录
}
}catch (IOException e) {
e.printStackTrace();
}
finally{
if(bis!=null)
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
if(bos!=null)
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
4.删除带内容的目录
import java.io.File;
public class DeleteDir {
public static void main(String[] args) {
File dir=new File("d:\\demodir");
remove(dir);
}
public static void remove(File dir) {
File []files=dir.listFiles();//获取目录中所有文件
for(File file:files){//变量文件
if(file.isDirectory()){//如果是目录
remove(file);//递归,深度遍历。
}
else{
file.delete();//删除文件
}
}
dir.delete();//删除目录
}
}
总结:File对象中封装了操作文件和文件夹的方法,所以,如果要对文件或文件夹进行操作,就封装在File对象中,方法对其操作。
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------