Java基礎知識之檔案操作(三)——NIO獲取檔案屬性
阿新 • • 發佈:2019-02-10
1.NIO簡單介紹
JDK1.4開始,Java提供一系列改進的輸入/輸出處理的新功能,被稱為New IO(NIO),在java.nio包下。
Channel(通道)和 Buffer(緩衝)是NIO中兩個核心物件。
JDK1.7對原有的NIO進行了改進,被稱為NIO.2。
NIO.2提供了全面的檔案IO和檔案系統訪問支援,基於非同步Channel的IO。
NIO.2中的操作檔案工具類Files,路徑工具類Paths,獲取Path介面物件,下面工具類的簡單使用
複製檔案
判斷檔案是否為隱藏檔案//複製檔案 Files.copy(Paths.get("G:/json.txt"), new FileOutputStream("G:/test.txt"));
//判斷檔案是否為隱藏檔案(判斷檔案,而非資料夾)
System.out.println(Files.isHidden(Paths.get("G:/json.txt")));
判斷檔案是否可讀可寫
//是否可寫
System.out.println(Files.isWritable(path));
//是否可讀
System.out.println(Files.isReadable(path));
得到檔案的大小
//得到檔案的大小(位元組) System.out.println(Files.size(Paths.get("G:/JavaApi/jdk-8u111-docs-all.zip")));
讀取檔案的所有行
//讀取檔案所有行,並制定讀取編碼
List<String> lines = Files.readAllLines(Paths.get("G:/json.txt"),Charset.forName("gbk"));
將多行字串寫入指定檔案
//將多行字串寫入指定資料夾,並指定編碼
Files.write(Paths.get("G:/test.txt"), lines, Charset.forName("gbk"));
得到系統盤的空間
FileStore dStore = Files.getFileStore(Paths.get("E:")); //D盤總空間 System.out.println(dStore.getTotalSpace()); //D盤可用空間 System.out.println(dStore.getUsableSpace());
2.FileVisitor遍歷檔案和目錄
// 遍歷G:\KuGou盤目錄下所有的檔案和子目錄
Files.walkFileTree(Paths.get("G:", "KuGou"), new SimpleFileVisitor<Path>() {
// 訪問目錄時使用發該方法
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
// 繼續遍歷 Continue繼續
return FileVisitResult.CONTINUE;
}
// 訪問檔案使用該方法
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
if (file.toString().endsWith(".mp3")) {
System.out.println(file);
//如果找到一個就返回則 新增以下程式碼 TERMINATE 結束
//return FileVisitResult.TERMINATE;
}
return FileVisitResult.CONTINUE;
}
});
}
3.WatchService監控檔案變化
//獲取檔案系統的WatchService物件
WatchService watchService = FileSystems.getDefault().newWatchService();
//為C:盤根路徑註冊監聽
Paths.get("C:/").register(watchService
//監聽建立操作
,StandardWatchEventKinds.ENTRY_CREATE
//監聽刪除操作
,StandardWatchEventKinds.ENTRY_DELETE
//監聽修改操作
,StandardWatchEventKinds.ENTRY_MODIFY);
//死迴圈一直監聽
while(true) {
//一直等待,直到獲取下一個檔案變化事件
WatchKey key = watchService.take();
//遍歷監控獲得的事件列表
for (WatchEvent<?> event : key.pollEvents()) {
//event.context()返回觸發事件的檔案或目錄
System.out.println(event.context() + "發生了" + event.kind()+ "事件");
}
//重新設定WatchKey
boolean valid = key.reset();
//如果設定失敗則退出監聽
if (!valid) {
break;
}
}
4.訪問檔案屬性
java.nio.file.attribute包下提供了工具類,可以讀取、修改檔案屬性
XxxAttributeView: 代表檔案的屬性的“檢視”
XxxAttributes:代表檔案屬性的”集合“,一般通過XxxAttributeView物件獲取XxxAttributes。
得到檔案的基本資訊
//獲得將要操作的檔案
Path path = Paths.get("G:/test.txt");
//獲取訪問基本屬性的BasicFileAttributeView
BasicFileAttributeView basicView = Files.getFileAttributeView(
path, BasicFileAttributeView.class);
//獲取訪問基本屬性的BasucFileAttributes
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 onerView = Files.getFileAttributeView(
path, FileOwnerAttributeView.class);
//獲取檔案所屬的使用者
System.out.println(onerView.getOwner());
//獲取系統中 guest對應的使用者 (保證電腦建立有多個使用者)
UserPrincipal user = FileSystems.getDefault()
.getUserPrincipalLookupService()
.lookupPrincipalByName("guset");
//修改使用者
onerView.setOwner(user);
設定檔案屬性(隱藏,只讀)
// 獲取訪問DOS屬性的DosFileAttributeView
DosFileAttributeView dosView = Files.getFileAttributeView(
path, DosFileAttributeView.class);
// 可以加以判斷,Files.isHidden(path)是否已經隱藏
// 將檔案設定為隱藏
dosView.setHidden(true);
// 設定為只讀
dosView.setReadOnly(true);