您的位置:首页 > 职场人生

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

2015-03-26 15:56 316 查看
------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培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: