File類
文件和目錄路徑名的抽象表示形式。
File類可以幹些什麼呢?
- 可以操作文件
- 可以操作文件夾
- 可以操作文件的路徑
常用方法 和 構造方法 代碼解析:
public class Demo01 {
public static void main(String[] args) throws IOException {
// fun1();
// fun2();
// fun3();
// fun4();
// fun5();
// fun6();
// fun7();
// 遍歷打印Test所有文件和文件夾
File file = new File("/Users/james/Desktop/Test");
printDiv(file);
}
public static void printDiv(File file) {
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
if (file2.isFile()) {
System.out.println(file2.getName());
}else {
printDiv(file2);
}
}
}
/**
*
*/
public static void fun7() {
File file = new File("/Users/james/Desktop/Test");
String[] list = file.list();
// 路徑下的所有文件及文件夾的名字(一層 以字符串形式)
for (String string : list) {
System.out.println(string);
}
System.out.println("----------------------------");
File[] listFiles = file.listFiles();
// 獲取的是該文件下 文件的全路徑 以文件對象形式
for (File file2 : listFiles) {
System.out.println(file2);
}
}
/**
*
*/
public static void fun6() {
// 和toString 方法一樣 輸出路徑 不管文件存在與否
File file = new File("/Users/james/Desktop/Test");
String path = file.getPath();
System.out.println(path);
// 獲取文件名字
String name = file.getName();
System.out.println(name);
// 獲取文件大小(獲取文件佔多少字節)
// 英文 一個字節 中午 三個字節
long length = file.length();
System.out.println(length);
// 獲取父級路徑
File parentFile = file.getParentFile();
System.out.println(parentFile);
}
/**
*
*/
public static void fun5() {
// 判斷文件是否存在
File file = new File("/Users/james/Desktop/Test/f");
boolean directory = file.isDirectory();
boolean file2 = file.isFile();
System.out.println(directory);
System.out.println(file2);
}
/**
*
*/
public static void fun4() {
// 刪除
// 刪除需謹慎 不走回收站
File file = new File("/Users/james/Desktop/Test/g");
boolean delete = file.delete();
// 如果文件夾下沒有子文件夾 纔可以刪除
System.out.println(delete);
}
/**
* @throws IOException
*/
public static void fun3() throws IOException {
// 創建文件方法
// 該方法只能創建文件 不給後綴也是創建的文件
File file = new File("/Users/james/Desktop/Test/HelloWord.txt");
boolean createNewFile = file.createNewFile();
// 文件已經存在不會在創建
System.out.println(createNewFile);
File file1 = new File("src/dp.txt");
boolean createNewFile2 = file1.createNewFile();
System.out.println(createNewFile2);
// 創建文件夾
// 帶不動後綴創建出來的都是文件夾
// mkdir()只能創建一級的文件夾 mkdirs() 可以創建多級的
File file2 = new File("/Users/james/Desktop/Test/g");
boolean mkdir = file2.mkdirs();
System.out.println(mkdir);
}
/**
*
*/
public static void fun2() {
// 構造方法
/*
* 絕對路徑
* 硬盤上的路徑 並且 這個路徑是唯一的
* 相對路徑
* 相對路徑是有參照物的
*
*/
File file = new File("/Users/james/Desktop/Test");
System.out.println(file.getAbsolutePath());
// 判斷改路徑是否存在
boolean exists = file.exists();
System.out.println(exists);
// 使用相對路徑 參照物 當前工程跟目錄
File file1 = new File("src/wl.txt");
boolean exists1 = file.exists();
System.out.println(exists1);
System.out.println(file1.getAbsolutePath());
String parent = "/Users/james/Desktop";
String child ="Test";
// 使用構造方法二
File file2 = new File(parent, child);
boolean exists2 = file.exists();
System.out.println(exists2);
// 使用構造方法三
File F = new File(parent);
File file3 = new File(F, child);
boolean exists3 = file.exists();
System.out.println(exists3);
}
/**
*
*/
public static void fun1() {
// File 類的靜態成員變量
// 不同平臺下獲取的路徑分隔符不同
// MAC 系統下 路徑分隔符:(冒號)
// win下 是分號
String pathseparator = File.pathSeparator;
System.out.println(pathseparator);
// 分隔符
// MAC系統 /
// win系統 \
String separator = File.separator;
System.out.println(separator);
}
}
例題練習:
//2.從控制檯輸入一個字符串 該字符串是文件夾路徑 計算這個文件夾的大小
//3.從控制檯輸入一個字符串 該字符串是文件夾路徑 刪除這個文件夾
public class Demo01 {
public static void main(String[] args) {
//File dirFile = getDirFile();
//deletDir(dirFile);
}
// 輸入路徑判斷是否是文件夾路徑 是就返回 不是就重新輸入
public static File getDirFile() {
Scanner scanner = new Scanner(System.in);
// 判斷
while (true) {
System.out.println("請輸入一個文件夾的路徑");
String path = scanner.nextLine();
// 利用傳進了的路徑創建文件對象來判斷
File file = new File(path);
if (!file.exists()) {
System.out.println("輸入路徑不存在,請重新輸入");
}else if (file.isFile()) {
System.out.println("你輸入的是文件,請重新輸入");
}else {
return file;
}
}
}
// 計算文件夾大小
public static long getDirLengthByFile(File file) {
long sum = 0;
// 遍歷文件夾
File[] listFiles = file.listFiles();
for (File subFile : listFiles) {
// 是文件就直接計算 不是文件就繼續遍歷
if (subFile.isFile()) {
sum += subFile.length();
}else {
sum += getDirLengthByFile(subFile);
}
}
return sum;
}
// 根據文件夾路徑刪除文件夾
public static void deletDir(File file) {
File[] listFiles = file.listFiles();
for (File subFile : listFiles) {
if (subFile.isFile()) {
subFile.delete();
}else {
// 是文件夾 繼續遍歷
deletDir(subFile);
}
}
// 傳入文件夾裏面的文件及文件夾 在上面全部刪除了 這時傳進來的文件夾已經空了
// 可以直接刪除
file.delete();
}
}
// 通過過濾器 遍歷文件夾 打印出小於200K的文件
public class Demo04 {
public static void getTxTFiled(File file){
File[] listFiles = file.listFiles(new MyFileNameFilter());
for (File file2 : listFiles) {
if (file2.isFile()) {
System.out.println(file2.getName());
}else {
getTxTFiled(file2);
}
}
}
public static void main(String[] args) {
File file = new File("/Users/james/Desktop/個人文件");
// 使用重載listFile 方法
getTxTFiled(file);
}
}
class MyFileNameFilter implements FilenameFilter{
//通過FilenameFilter過濾器獲取指定目錄中小於200K的小文件
@Override
public boolean accept(File dir, String name) {
// 參數1. 是傳進了的文件夾跟路徑
// 參數2. 該路徑下的文件名字和文件夾的名字
// 利用這兩個參數創建一個文件對象
File file = new File(dir, name);
// 過濾隱藏文件
if (file.isHidden()) {
return false;
}
if (file.isDirectory()) {
return true;
}
return file.length() > 204800;
}
}