NIO.2特性總結(一)靈活的Path

NIO.2More New I/O APIs for the Java Platform java

技術發展實在太快,NIO都沒弄透,java7中的NIO2又要開始進入咱們的程序,優化系統的性能了。最近在看《PRO Java 7 NIO.2CSDN上有下載,不用積分,好像只有英文版的,順便作點兒筆記。 網絡

我先總體介紹下java7在NIO上作的一些改動。其實我找了官網的更新文件,但上面並無說的很清楚,我就從書上給出的目錄大體列一下,這裏只說NIO的變化,其餘的變化,我記得有本書叫java7新特性吧,之前InfoQ上看過。 dom

NIO.2主要仍是在NIO.1的基礎上對文件系統和socket操做功能進行了加強。首先在加強對文件系統操做部分,增長了java.nio.file類,這部分在API內這樣描述Defines interfaces and classes for the Java virtual machine to access files, file attributes, and file systems。這裏有我今天要說的主管路徑的Path類,有鏈接文件系統的FileSystem類等,與之相關的還有java.nio.file.attribute包下的內容。這裏有對文件系統view的描述和操做。這部分能夠歸結爲: 異步

Path Operations socket

File Metadata 分佈式

Manager Symbolic and Hard links ide

Deal with Files and Directories 性能

Recursive File Operations 優化

New API working for random access file spa

而在網絡方面,我只想提java7對異步IO的操做,Asynchronous Channel。這部分是NIO.1非阻塞IO後最大的更新。若是你看過我對mina源碼的解讀,你應該還記得mina對異步的操做是採用future來實現的,這裏更底層的實現出來了。

Path對象主要作兩類事情,第一類叫syntactic operations,第二類operations over files referenced by paths。第一類就是對路徑的操做,這類操做每每都在內存中進行,不須要直接接入文件系統。第二類操做,爲文件操做提供一個引用,這個可能和之間咱們寫的URL比較類似。下面咱們具體看寫例子就能明白了。

The Path class is an upgraded version of the well-known java.io.File class, but the File class has kept a few specific operations, so it is not deprecated and cannot be considered obsolete. Moreover, starting with Java 7, both classes are available, which means programmers can mix their powers to obtain the best of I/O APIs. 這是否是意味着不久的未來File將會被取代,咱們先看段代碼:

/**
	 * out put: 1.txt file name:1.txt name count:2 parent:D:\nio2 root:D:\
	 */
	public static void testGetFile() {
		/** old method */
		File file1 = new File("D:\\nio2\\1.txt");
		System.out.println(file1.getName());

		/** nio2 */
		Path file = Paths.get("D:\\nio2\\1.txt");
		System.out.println("file name:" + file.getFileName());
		System.out.println("name count:" + file.getNameCount());
		System.out.println("parent:" + file.getParent() + " root:"
				+ file.getRoot());
		
		file1=file.toFile();
		System.out.println(file1.exists());
	}

咱們看下JDKFile的描述:An abstract representation of file and directory pathnames. User interfaces and operating systems use system-dependent pathname strings to name files and directoriesFile類其實名字有點兒誤導人,它並非指真正的文件,它的本質是用一種依賴系統的路徑名來描述文件或者目錄。這個通俗點兒講不就是path麼。咱們再看看二者的API的區別:

看着好像File類強大多了,可是你本身看看File類裏的方法,好多還真的是對Path的操做,真正的建立文件,寫入都是經過IO的。而反觀Path類,確實簡單了不少,更多的實現讓其子類去實現了,在Path類裏提供了toFile方法,將Path對象轉成File對象。不過Path對象確實更關注的是路徑,具體咱們往下看。

關於Path的定義後好多種,這裏只是列了其中的幾種,具體可看《PRO Java 7 NIO.2》 :

public static void definePath(){
		/**Define an Absolute Path*/
		Path path = Paths.get("C:/rafaelnadal/tournaments/2009/BNP.txt");
		Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt");
		Path path = Paths.get("C:", "rafaelnadal/tournaments/2009", "BNP.txt");
		Path path = Paths.get("C:", "rafaelnadal", "tournaments", "2009", "BNP.txt");
		/**Define a Path Relative to the File Store Root*/
		Path path = Paths.get("/rafaelnadal/tournaments/2009/BNP.txt");
		Path path = Paths.get("/rafaelnadal","tournaments/2009/BNP.txt");
		/**Define a Path Relative to the Working Folder*/
		Path path = Paths.get("rafaelnadal/tournaments/2009/BNP.txt");
		Path path = Paths.get("rafaelnadal","tournaments/2009/BNP.txt");
	}

另外根據上面的API截圖,你能利用Path作這麼一些但不侷限於這麼一些事:

Get information from path

Converting a path(其實就是把pathStringURL,把相對變絕對路徑等等)

Combining two paths

Comparing two paths

Iterate over the Name elements of a path(就是把一個複雜的目錄遍歷成一級一級的)

l  ……

文件這塊就簡單點兒的介紹了,我仍是想把重點放在異步NIO上,固然了最近主要要寫的仍是kafka的東西,《分佈式環境搭建》別錯過。這個就當作個筆記。天天都要接觸好多東西,記不住了。

相關文章
相關標籤/搜索