1. 程式人生 > >Java之路:Java 8中關於流的新功能

Java之路:Java 8中關於流的新功能

在Java 8 中的Java.io包和java.nio包中增添了一些方便、實用的操作I/O的方法,這裡的nio是java nonblocking input output(非阻塞IO)的簡寫。

下面簡要介紹其中的一些主要方法。

1、Java.io.BufferedReader類中lines()方法。

該方法的原型為:

public Stream<String> lines();

該方法返回一個Stream型別的物件,其中Stream的元素是從BufferedReader流中讀出的多行字串。下面是使用該方法的範例:
【示例1】
在這裡插入圖片描述

package
com.xy.io; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.stream.Stream; public class LinesTest { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "1.txt"); // 建立檔案物件 BufferedReader in = new BufferedReader
(new FileReader(file)); // 建立輸入流 Stream<String> lines = in.lines(); // 獲取檔案中的多選資料 lines.forEach((L)->System.out.println(L)); // 通過forEach輸出檢視 in.close(); } }

【結果】
在這裡插入圖片描述

2、java.nio.file.Files 類

public static List<String> readAllLines(Path path) throws IOException

該方法的作用與lines()方法類似,獲取一個檔案中的多行內容,並以List集合的方法返回。

其中的引數path(java.nio.file.Path)指向的是一個路徑,通過File類的toPath()方法可以得到一個這樣的物件。下面的範例演示的是該方法的使用。
【示例2】

package com.xy.io;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;

public class AllLinesTest {
	public static void main(String[] args) throws IOException {
		File file = new File("D:" + File.separator + "1.txt"); // 建立檔案物件
		List<String> lineList = Files.readAllLines(file.toPath());	// 獲得檔案中的多行
		for(String s : lineList) {
			System.out.println(s);
		}
	}
}

【結果】
在這裡插入圖片描述

需要注意的是使用這個方法如果沒有指定字符集,則預設為UTF-8,所以如果檔案的編碼格式不是UTF-8,則可能出現異常(編譯無法通過)或亂碼

此外,如果檔案是UTF-8格式,在處理中文的時候,還會有部分亂碼,如下圖所示。
在這裡插入圖片描述
這時,需要將UTF-8格式轉換成UTF-8 without BOM格式。BOM(Byte Order Mark)表示的是位元組序標記。

UTF- 8編碼的檔案中,BOM佔三個位元組。如果用記事本把一個文字檔案另存為UTF-8編碼方式的話,用十六進位制檔案編輯器(UtraEdit等)開啟這個檔案,切換到十六進位制編輯狀態就可以看到開頭的FFFE標識。這個標識是用來區分UTF-8編碼檔案的好辦法。上圖中的問號”?”就是這個符號無法顯示的亂碼。

3、java.nio.file.Files 類

public static Stream<Path> walk(Path start,int maxDepth,FileVisitOption... options)
throws IOException

該方法的作用是按照深度優先遍歷(traversed depth-first)的原則遍歷由start作為根目錄的檔案結構樹。並將遍歷的結果存入Stream集合中返回,其中的每一個元素都是Path型別的檔案路徑。

引數 maxDepth是表示遍歷的最大深度,如果是0 ,表示只遍歷根目錄,即只返回start指定的根目錄所對應的Path物件。

如果想要遍歷該檔案結構中的所有層,則可以將maxDepth引數設定為 Integer. MAX_VALUE。

引數options是一個FileVisitOption型別的值,該型別是列舉型別,僅有一個列舉值-FOLLOW_LINKS 。該引數是可選的。如果不填寫該引數,那麼在遍歷到符號連結檔案時不會進入其所連結的資料夾中。如果填寫了該引數——FileVisitOption.FOLLOW_LINKS,在遍歷到符號連結檔案時會進入其所連結的資料夾中繼續遍歷。

該方法是用的範例如下。

【示例3】

package com.xy.io;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

public class WalkTest {
	public static void main(String[] args) throws IOException {
		File file = new File("./src"); // 建立檔案物件
		// 將檔案轉換成Path
		Path path = file.toPath();
		// 獲取file所對應的根目錄檔案樹中的所有檔案
		Stream<Path> filedata = Files.walk(path, Integer.MAX_VALUE, FileVisitOption.FOLLOW_LINKS);
		// 輸出檢視
		filedata.forEach((p)->System.out.println(p.getFileName()));
		filedata.close();
	}
}

【結果】
在這裡插入圖片描述
在這裡插入圖片描述

在 JDK 1.8 中 同 時 提 供 了 一 個:

public static Stream<Path> walk(Path start, FileVisitOption... options) throws IOException

的方法, 這個方法的使用與上面相同, 不同的是maxDepth引數預設為 Integer.MAX_VALUE 。

提示
符號連結(symbolic link):符號連結又叫軟連線,是一類特殊的檔案,這個檔案包含了另一個檔案的路徑名(絕對路徑或者相對路徑),路徑可以是任意的檔案或目錄,可以連結到不同檔案系統的檔案。
連結符號的操作是透明的:對符號連結檔案進行讀寫的程式會表現為直接對目標檔案進行操作,某些需要特別處理符號連結檔案的程式可能會識別連結檔案。在Windows7 中建立連結檔案的命令是:mklink , 具體的引數可以再DOS下輸入mklink然後回車檢視詳細介紹。