Java基础知识之File类


一、概述
1.File类:文件和目录路径名的抽象表现形式。
2.用来对文件和文件夹的操作。
3.File类的实例是不可变的,一旦创建,File对象表示的抽象路径名不可以改变,
4.File对象可以作为参数传递给流的构造函数。
二、创建
File的构造方法
构造方法:
File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
示例一:
File f1 = new File("c:\\abc\\a.txt");
将c:\\abc\\a.txt封装成File对象,可以将已有的或者还未创建的文件或者文件夹封装成对象。
示例二:
File f2 = new File("C:\\abc","b.txt");
根据文件的所在目录和子文件创建对象。
示例三:
File f = new File("c:\\abcd");
File f2 = new File (f,"c.txt");
将文件的所在目录封装成对象,再将File对象和子文件封装成对象。

其实三种方式的效果都是一样的。
目录的分隔符再Java中使用\\也可以使用。


三、File的常见方法
1.创建
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了返回false,和输出流不一样,
输出流对象建立创建文件,如果文件已经存在,会覆盖。
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
2.删除
public boolean delete():删除文件或目录。文件存在,返回true;文件不存在或者正在被执行,返回false。
A:如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
B:Java中的删除不走回收站。
C:要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
void deleteOnExit(): 在程序退出时删除制定文件。


3.重命名
public boolean  renameTo(File dest) :如果路径名相同,就是改名。如果路径名不同,就是改名并剪切。
4.判断
public boolean isDirectory():判断是否是目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
记住:在判断文件对象是否是文件或者目录时,必须要判断该文件对象封装的内容是否存在。通过exists判断。
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏
public boolean isAbsolute():是否绝对路径
public boolean canExecate():是否可执行
5.获取
   public String getAbsolutePath():获取绝对路径
   public String getPath():获取相对路径
   public String getName():获取名称
   public long length():获取长度。字节数
   public long lastModified():获取最后一次的修改时间,毫秒值
String getParent():获取文件父目录。返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
如果相对路径中有上一层目录,那么该目录就是返回结果。



public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
  调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
public static File [] listRoots():列出文件系统根目录;
public String[] list(FilenameFilter filter):返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。
    FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。
public File[] listFiles(FilenameFilter filter):返回一个File数组,获取目录中满足制定过滤器的文件或目录。


练习:
判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称。
方法一:


分析:
  A:封装e盘目录
  B:获取该目录下所有文件或者文件夹的File数组
  C:遍历该File数组,得到每一个File对象,然后判断
  D:是否是文件
  是:继续判断是否以.jpg结尾
  是:就输出该文件名称
  否:不管它
  否:不管它


public class FileDemo {
	public static void main(String[] args) {
		// 封装e判断目录
		File file = new File("e:\\");

		// 获取该目录下所有文件或者文件夹的File数组
		File[] fileArray = file.listFiles();

		// 遍历该File数组,得到每一个File对象,然后判断
		for (File f : fileArray) {
			// 是否是文件
			if (f.isFile()) {
				// 继续判断是否以.jpg结尾
				if (f.getName().endsWith(".jpg")) {
					// 就输出该文件名称
					System.out.println(f.getName());
				}
			}
		}
	}
}
//方法二:


  //使用文件名称过滤器,再获取时候就进行判断
  //因为只是输出此文件名称,所以使用public String[] list();

public class FileDemo2 {
	public static void main(String[] args) {
		// 封装e判断目录
		File file = new File("e:\\");

		// 获取该目录下所有文件或者文件夹的String数组
		String[] strArray = file.list(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				//判断是否传入的目录和名称是否是文件并且是不是.jpg结尾。
				return new File(dir, name).isFile() && name.endsWith(".jpg");
			}
		});

		// 遍历
		for (String s : strArray) {
			System.out.println(s);
		}
	}
}




四:递归



方法定义中调用方法本身的现象

递归注意事项:
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
构造方法不能递归使用
示例一:
需求:请用代码实现求5的阶乘。
    下面的知识要知道:
  5! = 1*2*3*4*5
  5! = 5*4!

<pre name="code" class="java">public  DiGuiDemo{

	public static void main(String [] arsg){

		DiGui(5);
	}

		/*
		递归要有一个方法,
				返回值是int类型,参数列表是int n
				出口是:if(n=1){return 1};
				规律是:if(n != 1) {return n*方法名(n-1);}
	
		*/
	public static int  DiGui (int n){
		
		if(n==1){
			return 1;
		if(n!=1){
		
			return n*DiGui(n-1);
			}
		}

	}
}


 

示例二: 兔子问题(斐波那契数列) 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问第二十个月的兔子对数为多少? 第一个月: 1 第二个月: 1 第三个月: 2 第四个月: 3 第五个月: 5 第六个月: 8 ... 由此可见兔子对象的数据是:  1,1,2,3,5,8...  规则:  A:从第三项开始,每一项是前两项之和  B:而且说明前两项是已知的

public DiGui2{
 
	public static void  mian (String[] args){
	
		DiGui2(20);
	}
	public static int DiGui2(int n){
	
		if(n ==1 || n==2){
			return 1;
		}else{
			return fib(n-1)+fib(n-2);
		}
		
		
	}
	
 }

示例三:

需求:请大家把一个目录下所有的java结尾的文件的绝对路径给输出在控制台。
 
分析:
A:封装目录
B:获取该目录下所有的文件或者文件夹的File数组
C:遍历该File数组,得到每一个File对象
D:判断该File对象是否是文件夹
是:回到B
否:继续判断是否以.java结尾
是:就输出该文件的绝对路径
否:不管它


public FilePathDemo{
	public static void main(String [] args){
		
		File f = new File("d:\\abc");
		getFilePaths(f);
	}

	public static void getFilePaths(String path){
		// 获取该目录下所有的文件或者文件夹的File数组
		File [] fileArray = f.listFiles();

		// 遍历该File数组,得到每一个File对象
		for(File file :fileArray){
			
			//判断是否是文件夹,是就进行递归。
			if(file.isDirectory()){

				getFilePaths(file);

			}else{
				//继续判断文件是否已.java结尾
				if(file.getName().endWith(".java")){


					输出绝对路径在控制台上。
					System.out.println((file.getAbsolutePath());
				}
			}
		}
	}
}

示例四:
  需求:递归删除带内容的目录
  
  分析:
  A:封装目录
  B:获取该目录下的所有文件或者文件夹的File数组
  C:遍历该File数组,得到每一个File对象
  D:判断该File对象是否是文件夹
  是:回到B
  否:就删除


public class FileDeleteDemo {

	public static void main(String[] args) {
		// 封装目录
		File srcFolder = new File("demo");
		// 递归实现
		deleteFolder(srcFolder);
	}

	private static void deleteFolder(File srcFolder) {

		// 获取该目录下的所有文件或者文件夹的File数组
		File[] fileArray = srcFolder.listFiles();

		if (fileArray != null) {

			// 遍历该File数组,得到每一个File对象
			for (File file : fileArray) {

				// 判断该File对象是否是文件夹
				if (file.isDirectory()) {

					deleteFolder(file);

				} else {

					System.out.println(file.getName() + "---" + file.delete());
				}
			}

			System.out
					.println(srcFolder.getName() + "---" + srcFolder.delete());
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值