Java7中NIO學習之Files
阿新 • • 發佈:2018-12-25
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);
}
}