1. 程式人生 > >Java7中NIO學習之Files

Java7中NIO學習之Files

Files類是一個高度封裝的工具類,它提供了大量的方法來完成檔案複製,讀取檔案內容,寫入檔案內容等功能。這此原本需要程式設計師IO操作才能完成的功能,現在Files類只需要一個工具方法即可。

import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.nio.file.FileStore;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class FilesTest {
	public static void main(String[] args) throws Exception {
		// 複製檔案
		Files.copy(Paths.get("Youth.txt"), new FileOutputStream("a2.txt"));
		// 判斷FilesTest.java檔案是否為隱藏檔案
		System.out.println("FilesTest.java是否為隱藏檔案:" + Files.isHidden(Paths.get("Youth.txt")));
		// 一次性讀取FilesTest.java檔案的所有行
		List<String> lines = Files.readAllLines(Paths.get("Youth.txt"), Charset.forName("UTF-8"));
		System.out.println(lines);
		// 判斷指定檔案的大小
		System.out.println("FilesTest.java的大小為:" + Files.size(Paths.get("Youth.txt")));
		List<String> poem = new ArrayList<>();
		poem.add("水晶潭底銀魚躍");
		poem.add("清徐風中碧竿橫");
		// 直接將多個字串內容寫入指定檔案中
		Files.write(Paths.get("pome.txt"), poem, Charset.forName("gbk"));
		// 使用Java 8新增的Stream API列出當前目錄下所有檔案和子目錄
		Files.list(Paths.get(".")).forEach(path -> System.out.println(path));
		// 使用Java 8新增的Stream API讀取檔案內容
		Files.lines(Paths.get("Youth.txt"), Charset.forName("UTF-8")).forEach(line -> System.out.println(line));
		FileStore cStore = Files.getFileStore(Paths.get("C:"));
		// 判斷C盤的總空間,可用空間
		System.out.println("C:共有空間:" + cStore.getTotalSpace());
		System.out.println("C:可用空間:" + cStore.getUsableSpace());
	}
}


 使用FileVisitor遍歷檔案和目錄

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class FileVisitorTest {
	public static void main(String[] args) throws Exception {
		// 遍歷g:\publish\codes\15目錄下的所有檔案和子目錄
		Files.walkFileTree(Paths.get("d:", "VM"), new SimpleFileVisitor<Path>() {
			// 訪問檔案時候觸發該方法
			@Override
			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
				System.out.println("正在訪問" + file + "檔案");
				// 找到了FileInputStreamTest.java檔案
				if (file.endsWith("FileInputStreamTest.java")) {
					System.out.println("--已經找到目標檔案--");
					return FileVisitResult.TERMINATE;
				}
				return FileVisitResult.CONTINUE;
			}

			// 開始訪問目錄時觸發該方法
			@Override
			public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
				System.out.println("正在訪問:" + dir + " 路徑");
				return FileVisitResult.CONTINUE;
			}
		});
	}
}

 使用WatchService監控檔案變化:
import java.nio.file.FileSystems;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class WatchServiceTest {
	public static void main(String[] args) throws Exception {
		// 獲取檔案系統的WatchService物件
		WatchService watchService = FileSystems.getDefault().newWatchService();
		// 為C:盤根路徑註冊監聽
		Paths.get("C:/").register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
				StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
		while (true) {
			// 獲取下一個檔案改動事件
			WatchKey key = watchService.take(); // ①
			for (WatchEvent<?> event : key.pollEvents()) {
				System.out.println(event.context() + " 檔案發生了 " + event.kind() + "事件!");
			}
			// 重設WatchKey
			boolean valid = key.reset();
			// 如果重設失敗,退出監聽
			if (!valid) {
				break;
			}
		}
	}
}

訪問檔案屬性:

import java.util.*;
import java.nio.file.*;
import java.nio.*;
import java.nio.charset.*;
import java.nio.file.attribute.*;

public class AttributeViewTest {
	public static void main(String[] args) throws Exception {
		// 獲取將要操作的檔案
		Path testPath = Paths.get("D://test.txt");
		// 獲取訪問基本屬性的BasicFileAttributeView
		BasicFileAttributeView basicView = Files.getFileAttributeView(testPath, BasicFileAttributeView.class);
		// 獲取訪問基本屬性的BasicFileAttributes
		BasicFileAttributes basicAttribs = basicView.readAttributes();
		// 訪問檔案的基本屬性
		System.out.println("建立時間:" + new Date(basicAttribs.creationTime().toMillis()));
		System.out.println("最後訪問時間:" + new Date(basicAttribs.lastAccessTime().toMillis()));
		System.out.println("最後修改時間:" + new Date(basicAttribs.lastModifiedTime().toMillis()));
		System.out.println("檔案大小:" + basicAttribs.size());
		// 獲取訪問檔案屬主資訊的FileOwnerAttributeView
		FileOwnerAttributeView ownerView = Files.getFileAttributeView(testPath, FileOwnerAttributeView.class);
		// 獲取該檔案所屬的使用者
		System.out.println(ownerView.getOwner());
		// 獲取系統中guest對應的使用者
		UserPrincipal user = FileSystems.getDefault().getUserPrincipalLookupService().lookupPrincipalByName("guest");
		// 修改使用者
		ownerView.setOwner(user);
		// 獲取訪問自定義屬性的FileOwnerAttributeView
		UserDefinedFileAttributeView userView = Files.getFileAttributeView(testPath,
				UserDefinedFileAttributeView.class);
		List<String> attrNames = userView.list();
		// 遍歷所有的自定義屬性
		for (String name : attrNames) {
			ByteBuffer buf = ByteBuffer.allocate(userView.size(name));
			userView.read(name, buf);
			buf.flip();
			String value = Charset.defaultCharset().decode(buf).toString();
			System.out.println(name + "--->" + value);
		}
		// 新增一個自定義屬性
		userView.write("發行者", Charset.defaultCharset().encode("瘋狂Java聯盟"));
		// 獲取訪問DOS屬性的DosFileAttributeView
		DosFileAttributeView dosView = Files.getFileAttributeView(testPath, DosFileAttributeView.class);
		// 將檔案設定隱藏、只讀
		dosView.setHidden(true);
		dosView.setReadOnly(true);
	}
}