JavaSE笔记15.7-IO流-File类
一. 概述
- File类用来将文件或者文件夹封装成对象,方便对文件或文件夹进行操作
- File对象可以作为参数传递给流的构造函数
- File类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用流
二. 构造方法及常用变量
//如果pathname是实际存在的路径,则该File对象表示的是目录
//如果pathname是文件名,则该File对象表示的是文件
File(String pathname)
//parent是路径名,child是文件名
File(String parent,String child)
//parent是路径对象,child是文件名
File(File parent,String child)
//用于分隔连续多个路径字符串的分隔符,,Windows 下指';',在Linux下指':'
public static final String pathSeparator
//用于分隔同一个路径字符串中的目录,Windows 下指'\\',在Linux下指'/'
public static final String separator
例子:
import java.io.*;
class FileDemo{
public static void main(String[] args) {
File f1=new File("C:\\abc");
File f2=new File("C:\\abc\\a.txt");
File f3=new File("C:\\abc","b.txt");
File f4=new File(f1,"c.txt");
File f5=new File("C:"+File.separator+"abc"+File.separator+"d.txt");
System.out.println("f1: "+f1);
System.out.println("f2: "+f2);
System.out.println("f3: "+f3);
System.out.println("f4: "+f4);
System.out.println("f5: "+f5);
}
}
三. 常用方法
1. 创建
//在指定位置创建文件,如果该文件不存在则创建并返回true,如果该文件已存在则不创建并返回false
//和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖
boolean createNewFile()throws IOException;
//创建文件夹
boolean mkdir();
//创建多级文件夹
boolean mkdirs();
2. 删除
//删除当前文件或者目录;删除成功返回true,删除失败返回false
boolean delete();
//在程序退出时删除指定文件或者目录
void deleteOnExit();
3. 判断
//判断文件或者目录是否存在
boolean exists();
//判断当前File对象表示的文件是否是一个标准文件
boolean isFile();
//判断当前File对象表示的文件是否是一个目录
boolean isDirectory();
//判断当前File对象表示的文件是否是一个绝对路径名
boolean isAbsolute();
4. 获取
//返获取名称
String getName();
//获取路径
String getPath();
//获取父目录名
String getParent();
//获取绝对路径
String getAbsolutePath();
//获取最后一次的修改时间,毫秒值
long lastModified();
//获取长度,字节数
long length()
5. 重命名
//将当前File对象指定的文件更名为给定参数File指定的路径名
boolean renameTo(File dest)
6. 例子
import java.io.*;
class FileDemo{
public static void main(String[] args) {
try{
method();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void method() throws IOException {
//1. 创建指向文件的File对象
File f=new File("file.txt");
//2. 先判断文件是否存在
if(f.exists()){
//3. 存在则先删除
f.delete();
}
//4. 再创建文件
System.out.println("createNewFile:"+f.createNewFile());
//5. 创建指向目录的File对象
File f1=new File("abc");
File f2=new File("ABC\\dd\\ee\\ff");
//6. 创建目录
f1.mkdir();
f2.mkdirs();
//7. 判断是否是文件或者目录
System.out.println("f是否是文件:"+f.isFile());
System.out.println("f1是否是文件:"+f1.isFile());
System.out.println("f2是否是目录:"+f2.isDirectory());
//8. 判断是否是绝对路径
System.out.println("f是否是绝对路径:"+f.isAbsolute());
//9. 获取路径和绝对路径
System.out.println("path of f: "+f.getPath());
System.out.println("absolute path of f: "+f.getAbsolutePath());
System.out.println("parent of f: "+f.getParent());
File f3=new File("AutoTest\\file.txt");
System.out.println("path of f3: "+f3.getPath());
System.out.println("absolute path of f3: "+f3.getAbsolutePath());
System.out.println("parent of f3: "+f3.getParent());
//10. 重命名操作
File f4=new File("gbk.txt");
File f5=new File("abc\\rename.txt");
System.out.println("rename: "+f4.renameTo(f5));
}
}
运行结果是:
四. 文件列表功能
//列出可用的文件系统根
static File[] listRoots();
//返回某个目录下所有文件和目录的文件名
//调用list方法的File对象必须是封装了一个目录,否则会报NullPointerException
//如果该目录下为空,则返回数组为空
String[] list();
//返回某个目录下所有满足指定过滤器的文件和目录的文件名
//调用list(FilenameFilter)方法的File对象必须是封装了一个目录,否则会报NullPointerException
//如果该目录下为空,则返回数组为空
String[] list(FilenameFilter filter);
//返回某个目录下所有文件和目录对象
//调用listFiles方法的File对象必须是封装了一个目录,否则会报NullPointerException
//如果该目录下为空,则返回数组为空
File[] listFiles();
//返回某个目录下所有满足指定过滤器的文件和目录对象
//调用listFiles(FilenameFilter)方法的File对象必须是封装了一个目录,否则会报NullPointerException
//如果该目录下为空,则返回数组为空
File[] listFiles(FilenameFilter filter);
1. list(FilenameFilter)方法的原理
内部先调用无参的list()方法,然后实现FilenameFilter接口调用其accept()方法进行过滤,将符合条件的加入到返回数组中
//用于测试指定文件名称是否应包含在文件列表中,当名称应包含在文件列表中时返回true,否则返回false
boolean accept(File dir,String name);
public String[] list(FilenameFilter filter){
String[] names=list();
if((name==null)||(filter==null)){
return names;
}
List<String> v=new ArrayList<String>();
for(int i=0;i<names.length;i++){
if(filter.accept(this,names[i])){
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}
2. 例子
import java.io.*;
public class FileDemo2 {
public static void main(String[] args) {
listRootsDemo();
listDemo1();
listDemo2();
listFilterDemo1();
listFilterDemo2();
listFilterDemo3();
listFilterDemo4();
}
//返回指定目录下,后缀为.bmp的文件对象
public static void listFilterDemo4(){
File f=new File("C:\\day18");
//匿名内部类
File[] files=f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".bmp");
}
});
System.out.println("len: "+files.length);
for(File file:files){
System.out.println(file.getName()+"::"+file.length());
}
}
//返回指定目录下,后缀为.bmp的文件
public static void listFilterDemo3(){
File f=new File("C:\\day18");
//匿名内部类
String[] names=f.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".bmp");
}
});
System.out.println("len: "+names.length);
for(String name:names){
System.out.println(name);
}
}
//指定目录下所有文件或目录都符合条件
public static void listFilterDemo2(){
File f=new File("C:\\day18");
//匿名内部类
String[] names=f.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return true;
}
});
System.out.println("len: "+names.length);
for(String name:names){
System.out.println(name);
}
}
//指定目录下所有文件或目录都不符合条件
public static void listFilterDemo1(){
File f=new File("C:\\day18");
//匿名内部类
String[] names=f.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return false;
}
});
System.out.println("len: "+names.length);
for(String name:names){
System.out.println(name);
}
}
//列出指定目录下的所有文件或目录对象
public static void listDemo2(){
File f=new File("C:\\");
File[] files=f.listFiles();
for(File file:files){
System.out.println(file.getName()+"::"+file.length());
}
}
//列出指定目录下的所有文件或目录名称
public static void listDemo1(){
File f=new File("C:\\");
String[] names=f.list();
for(String name:names){
System.out.println(name);
}
}
//列出可用的文件系统根
public static void listRootsDemo(){
File[] files=File.listRoots();
for(File f:files){
System.out.println(f);
}
}
}
五. 列出目录下所有内容–递归
需求:列出指定目录下的文件或者文件夹,包括子目录中的内容,也就是列出指定目录下所有内容。
分析:
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可;
在列出过程中出现的还是目录的话,还可以再次调用本功能,也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。
import java.io.*;
public class FileDemo3 {
public static void main(String[] args) {
//列出指定目录下所有的内容
File dir=new File("C:\\200817");
showDir(dir);
}
public static void showDir(File dir){
System.out.println(dir);
File[] files=dir.listFiles();
for(File file:files){
if(file.isDirectory())
showDir(file);
else
System.out.println(file);
}
}
}
六. 删除带内容的目录–递归
在Windows中,删除目录从里面往外删除的。
既然是从里往外删除,就需要用到递归。
import java.io.*;
public class FileDemo4 {
public static void main(String[] args) {
//删除指定目录下所有的内容
File dir=new File("C:\\200818");
removeDir(dir);
}
private static void removeDir(File dir) {
File[] files=dir.listFiles();
for(File file:files){
if(file.isDirectory())
removeDir(file);
else
System.out.println(file+":-file-:"+file.delete());
}
System.out.println(dir+":-dir-:"+dir.delete());
}
}
七. 创建java文件列表文件
需求:将一个指定目录下的java文件的绝对路径,存储到一个文本文件中,建立一个java文件列表文件。
思路:
- 对指定的目录进行递归
- 获取递归过程所有的java文件的路径
- 将这些路径存储到集合中
- 将集合中的数据写入到一个文件中
import java.io.*;
import java.util.*;
public class JavaFileList {
public static void main(String[] args) {
File dir=new File("C:\\200818");
//用于暂存java文件路径的集合
List<File> list=new ArrayList<File>();
//将java文件路径暂存在集合中
filePathToList(dir,list);
//用于写入java文件路径的文本文件
File file=new File(dir,"javaList.txt");
try{
//将集合中的数据写入到文件中
writeToFile(list,file.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
private static void filePathToList(File dir, List<File> list) {
File[] files=dir.listFiles();
for(File file:files){
if(file.isDirectory())
filePathToList(file,list);
else{
if(file.getName().endsWith(".java"))
list.add(file);
}
}
}
private static void writeToFile(List<File> list,String fileName) throws IOException {
BufferedWriter bufw=new BufferedWriter(new FileWriter(fileName));
for(File file:list){
bufw.write(file.getAbsolutePath());
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}