Java基礎教程——File類、Paths類、Files類


File類

File類在java.io包中。io代表input和output,輸入和輸出。

代表與平台無關的文件和目錄。
可以新建、刪除、重命名,但不能訪問文件內容。

File類里的常量:

import java.io.File;
public class TestFileConst {
	public static void main(String[] args) {
		String s = "";
		// 文件分隔符:win反斜杠(\)linux正斜杠(/)
		s = File.separator;
		System.out.println(s);
		// 路徑分隔符:win分號(;)linux冒號(:)
		s = File.pathSeparator;
		System.out.println(s);
	}
}

File的構造方法里的參數——路徑:
|--可以是文件,也可以是文件夾
|--可以是相對路徑,也可以是絕對路徑
|--可以存在,也可以不存在(只是把路徑封裝成File對象,而已)

import java.io.*;
/**
 * File類的基本方法
 */
public class T010File基本方法 {
	public static void main(String[] args) throws IOException {
		String userDir = System.getProperty("user.dir");
		System.out.println(userDir);
		File file = new File(userDir);
		System.out.println("是文件嗎?" + file.isFile());
		System.out.println("是目錄嗎?" + file.isDirectory());
		System.out.println("文件多少字節?" + file.length());
		System.out.println("文件名【getName】" + file.getName());//文件夾返回0
		System.out.println("絕對路徑【getAbsoluteFile】" + file.getAbsoluteFile());
		System.out.println("上層路徑【getParent】" + file.getParent());
		System.out.println("=====臨時文件=====");
		File fileTemp = File.createTempFile("tmp_", ".txt", file);
		System.out.println("臨時文件:" + fileTemp.getAbsolutePath());
		System.out.println("臨時文件【exists】:" + fileTemp.exists());
		System.out.println("JVM退出時刪除臨時文件");
		fileTemp.deleteOnExit();
	}
}

遞歸掃描文件夾

import java.io.*;
public class folderScanner {
	public static void main(String[] args) {
		try {
			getFiles("C:\\Program Files\\Java");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private static void getFiles(String path_src) throws IOException {
		File pathS_Files = new File(path_src);
		if (!pathS_Files.isDirectory()) {
			System.out.println("輸入的文件夾路徑有誤!");
			return;
		}
		File[] listFiles = pathS_Files.listFiles();
		for (int i = 0; i < listFiles.length; i++) {
			File f1 = listFiles[i];
			if (f1.isDirectory()) {
				// 如果是文件夾,繼續往下找
				getFiles(f1.getAbsolutePath());
			} else if (f1.isFile()) {
				System.out.println(f1.getAbsolutePath());
			}
		}
	}
}

升級:過濾文件

public File[] listFiles(FileFilter filter)方法,可以過濾獲取到的文件,需要實現FileFilter接口。

下面示例大部分代碼和上例一樣,只是加入了FileFilter,

import java.io.*;
/**
 * ↓↓↓用於抽象路徑名(即File對象)的過濾器。
 */
class MyFileFilter implements FileFilter {
	@Override
	// accept:過濾文件的方法
	// 參數:遍歷目錄得到的每一個文件(File對象)
	public boolean accept(File pathname) {
		if (pathname.isDirectory()) {
			// 是文件夾,放行
			return true;
		} else if (pathname.getName().toLowerCase().endsWith(".txt")) {
			// 是匹配的文件,放行
			return true;
		} else {
			// 其它文件,過濾掉
			return false;
		}
	}
}
public class folderScanner {
	public static void main(String[] args) {
		try {
			getFiles("C:\\Program Files\\Java");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private static void getFiles(String path_src) throws IOException {
		File pathS_Files = new File(path_src);
		if (!pathS_Files.isDirectory()) {
			System.out.println("輸入的文件夾路徑有誤!");
			return;
		}
        // ↓↓↓
		// 本例核心代碼:兩個版本(其實還能寫個匿名內部類版本)
		// File[] listFiles = pathS_Files.listFiles(new MyFileFilter());
		// * FileFilter接口只有一個方法,於是可以采用Lambda表達式寫法:
		File[] listFiles = pathS_Files.listFiles((pathname) -> {
			if (pathname.isDirectory()) {
				// 是文件夾,放行
				return true;
			} else if (pathname.getName().toLowerCase().endsWith(".txt")) {
				// 是匹配的文件,放行
				return true;
			} else {
				// 其它文件,過濾掉
				return false;
			}
		});
        // ↑↑↑
		for (int i = 0; i < listFiles.length; i++) {
			File f1 = listFiles[i];
			if (f1.isDirectory()) {
				// 如果是文件夾,繼續往下找
				getFiles(f1.getAbsolutePath());
			} else if (f1.isFile()) {
				System.out.println(f1.getAbsolutePath());
			}
		}
	}
}

練習:在控制台輸入路徑,掃描該文件夾,並統計一共有多少個文件、多少個文件夾、多少個java代碼文件。

創建和刪除相關

package day0422;
import java.io.File;
import java.io.IOException;
public class TestNewFile {
	public static void main(String[] args) {
		File f = new File("2.txt");
		try {
			// 創建新文件,成功為true,不覆蓋
			// 文件夾必須存在,否則拋異常
			boolean create = f.createNewFile();
			System.out.println(create);
		} catch (IOException e) {
			e.printStackTrace();
		}
		// ----------------------------
		// 創建單層文件夾
		f = new File("2");
		boolean mkdir = f.mkdir();
		System.out.println(mkdir);
		// 創建多層文件夾(“4.txt”作為文件夾名而創建)
		f = new File("2\\3\\4.txt");
		boolean mkdirs = f.mkdirs();
		System.out.println(mkdirs);
		// 刪除文件或文件夾(最后一層)
		// |--最后一層文件夾中有內容,不刪,返回false
		// |--路徑不存在,返回false
		// |--不走回收站
		boolean delete = f.delete();
		System.out.println(delete);
	}
}

應用:創建文件,若有同名文件,刪之。

import java.io.*;
public class T011File無則建有則刪 {
	public static void main(String[] args) {
		File f1 = new File("tmp_File有則刪.txt");
		if (f1.exists()) {
			boolean delete = f1.delete();
			System.out.println("刪除同名文件:" + delete);
		}
		try {
			boolean ret = f1.createNewFile();
			System.out.println("創建文件:" + ret);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}

Java 7的nio.file包

Paths類

和File類比較像

import java.nio.file.Path;
import java.nio.file.Paths;
public class T031nioPaths {
	public static void main(String[] args) throws Exception {
		String _user_dir = System.getProperty("user.dir");
		// 獲取Path對象
		Path _path = Paths.get(_user_dir);
		System.out.println(".toAbsolutePath()【】" + _path.toAbsolutePath());
		// 根路徑
		System.out.println(".getRoot()【】" + _path.getRoot());
		// 包含的路徑(不含根路徑)
		int nameCount = _path.getNameCount();
		for (int i = 0; i < nameCount; i++) {
			System.out.println("\t" + _path.getName(i));
		}
		System.out.println(".getNameCount()包含的路徑數量【】" + nameCount);
		// 以多個String來構建Path對象
		Path path2 = Paths.get("g:", "publish", "codes");
		System.out.println(path2);
	}
}

Files類

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.charset.*;
import java.nio.file.FileStore;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class T032nioFiles {
	public static void main(String[] args) throws Exception {
		System.out.println("=====Files.copy:復制文件=====");
		Path _path源文件 = Paths.get("testRead.dat");
		OutputStream os = new FileOutputStream("Files.copy.txt");// 工作路徑下
		long copy = Files.copy(_path源文件, os);
		System.out.println("Files.copy() return value = " + copy);
		System.out.println("Files.size(源文件):" + Files.size(_path源文件));
		System.out.println("=====Files.readAllLines:讀文件=====");
		List<String> lines = Files.readAllLines(_path源文件, Charset.forName("utf-8"));
		System.out.println("Files.readAllLines()讀到的行數——" + lines.size());
		System.out.println("=====Files.write:寫文件=====");
		List<String> _list = new ArrayList<>();
		_list.add("我西牛賀洲者,不貪不殺,養氣潛靈,雖無上真,人人固壽;");
		_list.add("但那南贍部洲者,貪淫樂禍,多殺多奪,正所謂口舌凶場,是非惡海。");
		Path _pathW = Files.write(Paths.get("Files.write.txt"), _list, Charset.forName("gbk"));
		System.out.println("寫入文件——" + _pathW.toAbsolutePath());
		System.out.println("=====FileStore:查看C盤空間=====");
		FileStore cStore = Files.getFileStore(Paths.get("C:"));
		System.out.println("C:共有空間:" + cStore.getTotalSpace());
		System.out.println("C:可用空間:" + cStore.getUsableSpace());
		// -------------------------------------
		System.out.println("=====使用Java 8的Stream API列出當前目錄下所有文件和子目錄=====");
		Files.list(Paths.get(".")).forEach(path -> System.out.println(path));
		// -------------------------------------
		System.out.println("=====使用Java 8的Stream API讀取文件內容=====");
		Files.lines(_path源文件, Charset.forName("utf-8")).forEach(line -> System.out.print(line));
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM