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集合的方法返回。
【示例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然後回車檢視詳細介紹。