------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培训、期待与您交流! -------