今天学习的内容是File类
File类代表的是文件或者目录的路径名称,而不是文件的内容。通常使用File对象代替字符串文件名作为构造函数的参数传给FileWriter、FileReader、Fileoutputstream或FileInputStream是一种更加安全的做法。关于File类的构造方法,常用方法的使用及注意事项见程序示例:
public class Test83 {
@SuppressWarnings("unused")
public static void main(String[] args) {
// 创建File对象
File f1 = new File("test.txt");
File f2 = new File("f:\\", "test.txt");
File f3 = new File(new File("f:\\"), "text.txt");
File f4 = new File("f:" + File.separator + "test.txt");
// File类常用方法1:获取
System.out.println(f1.getName());// test.txt 获取文件名称
System.out.println(f1.getAbsolutePath());// E:\IDE\workspace\Test83\test.txt
// 获取文件绝对路径
System.out.println(f1.getPath());// test.txt 获取文件抽象路径名(构造函数写的啥这里就是啥)
System.out.println(f1.length());// 0 获取文件大小(字节为单位)
System.out.println(f1.lastModified());// 1480419406572 获取文件最后修改时间
// File类常用方法2:创建与删除
File file = new File("new.txt");
try {
file.createNewFile();// 若文件不存在则创建文件,若文件存在则不创建(不会覆盖原文件)
} catch (IOException e) {
e.printStackTrace();
}
// file.delete(); 删除文件
File dir = new File("k");
dir.mkdir();// 创建新目录(单级目录)
// dir.mkdirs(); 创建新目录(多级目录)
// dir.delete(); 删除目录,注意如果目录中含有内容,无法使用此方法删除
// File类常用方法3:判断
System.out.println(f1.exists());// true 判断文件或目录是否存在
System.out.println(file.exists());// true 判断文件是否存在
System.out.println(f1.isFile());// true 判断是否为文件(最好先判断是否存在)
System.out.println(file.isFile());// true 判断是否为文件
System.out.println(dir.isDirectory());// true 判断是否为目录(最好先判断是否存在)
// File类常用方法4:重命名
File rename = new File("rename.txt");
file.renameTo(rename);
// File类常用方法5:系统根目录
File[] files = File.listRoots();
for (File f : files) {
System.out.print(f);// C:\D:\E:\G:\ 系统根目录
}
// File类常用方法6:获取目录内容
File dir_list = new File("c:\\");
if (dir_list.isDirectory()) {
String[] dirContents = dir_list.list();// 获取当前目录下的文件及文件夹的名称,包含隐藏文件
for (int i = 0; i < dirContents.length; i++) {
System.out.println(dirContents[i]);
}
}
// File类常用方法7:过滤器(比如只想获取c盘的.txt文件)
File dir_list_filter = new File("c:\\");
String[] dirContents_filter = dir_list_filter.list(new FilterByTxt());
for (int i = 0; i < dirContents_filter.length; i++) {
System.out.println("使用过滤器获取目录内容:" + dirContents_filter[i]);// 使用过滤器获取目录内容:ImbaMallLog.txt
}
}
}
// 过滤器
class FilterByTxt implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
}
关于File类的练习如下(其中使用到递归):
public class Test84 {
public static void main(String[] args) {
File dir = new File("e:\\IDE\\workspace\\Test84");
test_1(dir, 0);
int num = 6;
System.out.print(num+"的二进制结果为:");
test_2(num);
File dir_delete = new File("test");
test_3(dir_delete);
}
//删除一个带内容的目录
private static void test_3(File dir) {
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
if(files[i].isDirectory()){
test_3(files[i]);
}else{
System.out.println(files[i]+":"+files[i].delete());
}
}
System.out.println(dir+":"+dir.delete());
}
//使用递归获取任意数字的二进制结果
private static void test_2(int num) {
if(num>0){//注意递归一定要明确结束递归的条件,否则会发生栈异常
System.out.print(num%2);
test_2(num/2);
}
}
// 列出当前目录的所有内容,包括子目录的内容
private static void test_1(File dir, int level) {
level++;
File[] files = dir.listFiles();// 获取指定目录下的所有目录及文件对象
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
System.out.println(getSpace(level-1) + ":" + files[i]);
test_1(files[i], level);// 递归
} else {
System.out.println(getSpace(level-1) + ":" + files[i].getAbsolutePath());
}
}
}
private static String getSpace(int level) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < level; i++) {
sb.append(" ");
}
return sb.toString();
}
}