黑马程序员---Java基础---File类

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一.File类

         1.什么是File类

                   File类代表一个文件或文件夹的路径

                   File类中的方法都是文件或文件夹的操作

       2.绝对路径和相对路径

                   绝对路径: 从盘符开始的, 完整的路径. 不论在什么环境下运行, 都是找指定的路径.

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");

                   相对路径: 不从盘符开始, 相对于一个其他路径. Eclipse中相对于工程文件夹, cmd中相对于提示符目录. 运行环境不同, 相对的路径也就不同.

File f2 = new File("file.txt");

         3.构造函数

                   File(String pathname)     

                            通过指定路径创建一个File对象

File f3 = new File("src");//文件夹

                   File(String parent, Stringchild)

                            通过指定父级路径和自己路径创建一个File对象

String parent1 = "F:/Workspace/EclipseWorkspace/tist/src/it/file";
File f1 = new File(parent1, "FileDemo.java");//指定父级路径和子级路径

                   File(File parent, Stringchild)

                            和上面方法类似, 但父级路径是一个File对象

File parent2 = new File("F:/Workspace/EclipseWorkspace/tist/src");
File f2 = new File(parent2, "FileDemo.java");//指定父级路径和子级路径

         4.常用方法

String   getName()

获取文件名

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
System.out.println(f1.getName());      //获取文件名

String   getParent()

 获取父级路径名

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
System.out.println(f1.getParent());       //获取父级路径名

 long    length()

 获取文件大小

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
System.out.println("f1文件大小 " + f1.length());//获取文件大小单位字节 

                 long    lastModified()

获取最后修改时间

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
System.out.println(new Date(f1.lastModified())); //最后修改时间

boolean    exists()

判断是否存在

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
System.out.println("f1是否存在:" + f1.exists());//判断路径是否存在

boolean    isFile()

判断是否是文件

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
System.out.println("f1是否是文件:" + f1.isFile());//判断是否是文件

boolean    isDirectory()

判断是否是文件夹

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
System.out.println("f1是否是文件夹" + f1.isDirectory());//判断是否是文件夹

 boolean    renameTo(File dest)

  改名

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
f1.renameTo(new File("F:\\file2.txt"));//重命名,改路径(类似剪切)

 boolean    createNewFile()

创建新文件

File f1 = new File("F:/Workspace/EclipseWorkspace/tist/file.txt");
System.out.println(f1.createNewFile());//创建文件,如果成功返回true

boolean    mkdir()

 创建文件夹(不包含父级)

File f1 = new File("F:/Workspace/EclipseWorkspace/tist");
System.out.println(f2.mkdir()); //创建文件夹,不能创建多个文件夹

 boolean    mkdirs()

 创建文件夹(包含父级)

File f1 = new File("F:/Workspace/EclipseWorkspace/tist");
System.out.println(f2.mkdirs());//创建文件夹,如果父级路径不存在就一起创建

boolean    delete()

 删除

File f1 = new File("f.txt");
File f2 = new File("f/e/a");
File f3 = new File("f");
      
System.out.println(f1.delete());//删除文件成功返回true
System.out.println(f2.delete());//删除文件夹成功返回true
System.out.println(f3.delete());//删除文件夹,里面有文件或文件夹,都不能删除

String[]    list()

 获取文件夹下的所有子文件名(String)

File file = new File("F:/Workspace/EclipseWorkspace/tist/src/it/file");
String[] nameArr = file.list(); //获取文件夹下所有子文件(包括文件夹)的文件名

 File[]    listFiles()

               获取文件夹下的所有子文件(File对象)

File file = new File("F:/Workspace/EclipseWorkspace/tist/src/it/file");
File[] nameArr = file.listFiles(); //获取file下所有子文件(File对象)

 long    getTotalSpace()

              返回此抽象路径名指定的分区大小

File file = new File("F:/Workspace/EclipseWorkspace/tist/src/it/file");
System.out.println("文件所在盘符总空间" + f1.getTotalSpace());

long    getFreeSpace()

                返回此抽象路径名指定的分区中未分配的字节数

File file = new File("F:/Workspace/EclipseWorkspace/tist/src/it/file");
System.out.println("文件所在盘符剩余空间" + f1.getFreeSpace());

boolean    canExecute()

测试应用程序是否可以执行此抽象路径名表示的文件

File f1 = new File("file.txt");
System.out.println("是否可执行 " + f1.canExecute());

boolean    canRead()

                 测试应用程序是否可以读取此抽象路径名表示的文件

File f1 = new File("file.txt");
System.out.println("是否可读 " + f1.canRead());

        boolean   canWrite()

                  测试应用程序是否可以修改此抽象路径名表示的文件

File f1 = new File("file.txt");
System.out.println("是否可写 " + f1.canWrite());

boolean    isHidden()

                  测试此抽象路径名指定的文件是否是一个隐藏文件

File f1 = new File("file.txt");
System.out.println("是否是隐藏的 " + f1.isHidden());

boolean    setReadable(booleanreadable)

                  设置此抽象路径名所有者读权限的一个便捷方法

File f1 = new File("file.txt");
f1.setReadable(true);

boolean    setWritable(booleanwritable)

                设置此抽象路径名所有者写权限的一个便捷方法

File f1 = new File("file.txt");
f1.setWritable(false);//设置为只读

boolean    setExecutable(booleanexecutable)

                设置此抽象路径名所有者执行权限的一个便捷方法

File f1 = new File("file.txt");
f1.setExecutable(true);

二.递归

1.什么是递归

                   函数自己调用自己就是递归, 有些时候在程序中的工作需要反复调用, 可以使用递归解决, 通常递归调用函数都会有一个退出条件.

 

三.File类练习

1 .打印指定文件夹下所有以.java结尾的文件

思路:

1.      获取文件夹路径

2.      获取文件夹下所有子文件(File对象

3.      遍历子文件

4.      判断以.java结尾,且是文件

5.      打印文件名

	public static void demo6() {
		File file  = new File("F:/Workspace/EclipseWorkspace/tist/src/it/file");
		File[] nameArr = file.listFiles();							//获取file下所有子文件(File对象)
		for (File name : nameArr) 									//遍历子文件
			if (name.getName().endsWith(".java") && name.isFile())	//判断文件名以.java结尾,并且是文件
				System.out.println(name.getName());					//打印文件名
	}

	public static void demo5() {
		File file = new File("F:/Workspace/EclipseWorkspace/tist/src/it/file");
		String[] nameArr = file.list();						//获取文件夹下所有子文件(包括文件夹)的文件名
		for (String name : nameArr) {						//遍历文件名
			File f = new File(file, name);					//封装成File对象
			if (name.endsWith(".java") && file.isFile()) 	//判断文件名以.java结尾,并且是文件
				System.out.println(name);
		}
	}


2.从键盘接收一个文件夹路径,按照最后修改时间排序将该文件夹下的所有.java文件名写入file.txt中, 如果输入的路径不存在,要给予提示, 如果输入的路径不是一个文件夹路径,也要给予提示

思路:

1.      创建输入流接收键盘输入的数据,读取一行

2.      将读取的数据封装成File对象

3.      用if () {…..} else if () {…..} else {…..}语句判断路径是否正确

4.      获取所有子文件名装入File[]中

5.      创建TreeSet集合并传入比较器

6.      将File[]元素传入TreeSet中

7.      创建输出流

8.      遍历TreeSet

9.      判断文件名以.java结尾,并且是文件写出

10.  关输出流

package it.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.Comparator;
import java.util.TreeSet;

public class Exercise1 {

	public static void main(String[] args) throws IOException {
		
		// 1.从键盘接收一个文件夹路径,将该文件夹下的所有.java文件名写入F:\file.txt中
		System.out.println("请输入一个文件夹路径");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//标准输入流虚拟机自动关流
		String line = br.readLine();
		File dir = new File(line);//封装成File对象
		
		// 2.如果输入的路径不存在,要给予提示,如果输入的路径不是文件夹路径,也要给予提示
		if (!dir.exists())
			System.out.println("路径不存在。");
		else if (!dir.isDirectory())
			System.out.println("您输入的不是文件夹路径");
		else {
			File[] nameArr = dir.listFiles();//获取子文件名装入File[]中
			
		// 3.写入的文件名按最后修改时间排序
			TreeSet<File> set = new TreeSet<File>(new Comparator<File>() {
				public int compare(File o1, File o2) {
					int x;
					if (o1.lastModified() > o2.lastModified())
						x = 1;
					else if (o1.lastModified() < o2.lastModified())
						x = -1;
					else
						x = 0;
					return x != 0 ? x : o1.compareTo(o2);//按最后修改时间排序,相同按名字排序
				}
			});//按特定顺序排序传入比较器,重写compare方法
			Collections.addAll(set, nameArr);//将File[]的元素传入set中
			BufferedWriter bw = null;
			try {
				bw = new BufferedWriter(new FileWriter("F:\\file.txt"));
				for (File file : set) 
					if (file.isFile() && file.getName().endsWith(".java")) {//判断文件名以.java结尾,并且是文件
						bw.write(file.getName());
						bw.newLine();
					}
			} finally {
				bw.close();
			}
		}
	}

}


3.将文件夹路径下的所有子文件(包括文件夹)的名字有层次的写入到F:\\file.txt中,并计算文件夹大小

思路:

1.      新建一个DirUtil类用getDir()方法接收键盘输入的文件夹路径,并判断路径是否正确,不正确则提示重新输入,备用

2.      用递归的方式实现将文件夹路径下所有子文件的名字有层次写入F:\\file.txt中

3.      用递归的方式实现计算文件夹大小

package it.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
/**
 * 从键盘接收一个文件夹路径
 * 如果路径不存在,给予提示,并且重新输入
 * 如果不是文件夹路径,给予提示,并且重新输入
 * @author panbin
 *
 */
public class DirUtil {

	public static File getDir() throws IOException {
		//从键盘接收一个文件夹路径
		System.out.println("请输入一个文件夹路径:");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		while (true) {
			File dir = new File(br.readLine());
			if (!dir.exists()) 
				//如果路径不存在,给予提示,并且重新输入
				System.out.println("您输入的路径不存在,请重新输入:");
			else if (!dir.isDirectory())
				//如果不是文件夹路径,给予提示,并且重新输入
				System.out.println("您输入的不是 文件夹路径,请重新输入:");
			else 
				return dir;
		}
	}
}

package it.file;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Exercise3 {

	public static void main(String[] args) throws IOException {
		//从键盘接收一个文件夹路径
		File dir = DirUtil.getDir();
		//创建输出流,不要在方法中创建,因为递归时会因重新创建而清空
		BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\file.txt"));
		printFileName(dir, bw, 0);
		bw.close();
		System.out.println(getLength(dir));//统计文件夹大小
		
	}

	/**
	 * 将文件夹路径下的所有子文件(包括文件夹)的名字有层次的写入到F:\\file.txt中
	 * @param dir	文件夹路径
	 * @param bw	输出流
	 * @param lv	层次
	 * @throws IOException
	 */
	public static void printFileName(File dir, BufferedWriter bw, int lv) throws IOException {
		//将路径下的所有子文件(包括文件夹)的名字写入到F:\\file.txt中
		File[] fileArr = dir.listFiles();		//获取所有子文件
		for (File file : fileArr) {				//循环遍历每个子文件
			for (int i = 0; i < lv; i++)		//按照层次循环
				bw.write("\t");					//输出前面的Tab
			bw.write(file.getName());			//写出文件名
			bw.newLine();						//换行
			if (file.isDirectory()) {			//如果是文件夹	
				printFileName(file, bw, lv + 1);//再打印这个文件夹下所有子文件
			}
		}
	}
	/**
	 * 统计文件夹大小
	 * @param dir	要统计的文件夹
	 * @return		大小
	 */
	public static long getLength(File dir) {
		long len = 0;						//用来统计大小
		File[] fileArr = dir.listFiles();	//获取所有子文件
		for (File file : fileArr) 			//循环遍历每个子文件
//			if (file.isFile())				//如果是文件统计文件大小
//				len += file.length(); 		//累计文件大小
//			else
//				len += getLength(file);		//如果是文件夹递归累计子文件夹大小
			len += file.isFile() ? file.length() : getLength(file);
		return len;
	}
}

4. 从键盘接收一个文件夹路径,将文件夹删除

思路:

1.      用DirUtil.getDir()接收文件夹路径

2.      提示确定删除

3.      获取所有子文件

4.      是文件就删除

5.      是文件夹就递归

6.      删除空文件夹

package it.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class Exercise4 {

	public static void main(String[] args) throws IOException {
		File dir = DirUtil.getDir();		//从键盘接收一个文件夹路径
		System.out.println("请问确定要删除\"" + dir.getAbsolutePath() + "\"吗(Y/N)");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = br.readLine();
		if (line.equalsIgnoreCase("Y"))
			deleteDir(dir);					//删除文件夹
		System.out.println("文件夹已删除!");
	}

	private static void deleteDir(File dir) {
		File[] fileArr = dir.listFiles();	//获取所有子文件
		for (File file : fileArr) 			//循环遍历
			if (file.isFile())				//如果是文件就删除
				file.delete();
			else							//如果是文件夹就递归
				deleteDir(file);
		dir.delete();						//删除文件夹
	}
}

5. 从键盘接收2个文件夹路径,将第一个文件夹拷贝到第二个文件夹下,注意:2个文件夹路径不能相同,也不能有嵌套关系(会造成无限循环拷贝)

       思路:

1.      用DirUtil.getDir()接收2个文件夹路径,目标src, 目的dest

2.      在dest中创建一个和src 同名的文件夹

3.      获取src中的所有子文件

4.      遍历子文件

5.      是文件就直接创建输入输出流拷贝

6.      是文件夹就递归      

package it.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Exercise6 {

	public static void main(String[] args) throws IOException {
		File src = DirUtil.getDir();	//从键盘接收一个文件夹路径
		File dest = DirUtil.getDir();	//从键盘接收另一个不同的文件夹路径
//		copyDir(src, dest);				//将第一个文件夹中的内容拷贝到第二个文件夹中
	}

	/**
	 * 拷贝文件夹(包括子文件夹)注意:路径不要相同避免形成递归
	 * @param src	目标文件夹
	 * @param dest	目的文件夹
	 * @throws IOException
	 */
	private static void copyDir(File src, File dest) throws IOException {
		File newDir = new File(dest, src.getName());//指定父级路径和子级路径
		newDir.mkdir();								//在dest文件夹中创建与src同名的文件夹
		File[] fileArr = src.listFiles();			//获取src中所有子文件
		for (File file : fileArr) {					//循环遍历子文件
			if (file.isFile()) {					//如果是文件就拷贝
				FileInputStream fis = new FileInputStream(file);	//创建输入流
				FileOutputStream fos = new FileOutputStream(newDir);//创建输出流
				byte[] buffer = new byte[8192];						//定义数组用来当做缓冲区
				int len;											//定义变量,用来记住每次拷贝的个数
				while ((len = fis.read(buffer)) != -1)				// 从流中读取数据到Buffer中,len记住读取个数
					fos.write(buffer, 0, len);						// 将buffer中的数据写出,写出len个
				fis.close();						//关闭输入流
				fos.close();						//关闭输出流
			} else									//如果是文件夹就递归	
				copyDir(file, newDir);
		}
	}

}

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值