1. 程式人生 > >Java基礎知識之檔案操作(三)——NIO獲取檔案屬性

Java基礎知識之檔案操作(三)——NIO獲取檔案屬性

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);