Java讀取文件內容的六種方法


1.Scanner

第一種方式是Scanner,從JDK1.5開始提供的API,特點是可以按行讀取、按分割符去讀取文件數據,既可以讀取String類型,也可以讀取Int類型、Long類型等基礎數據類型的數據。

@Test
void testReadFile1() throws IOException { //文件內容:Hello World|Hello Zimug String fileName = "D:\\data\\test\\newFile4.txt"; try (Scanner sc = new Scanner(new FileReader(fileName))) { while (sc.hasNextLine()) { //按行讀取字符串 String line = sc.nextLine(); System.out.println(line); } } try (Scanner sc = new Scanner(new FileReader(fileName))) { sc.useDelimiter("\\|"); //分隔符 while (sc.hasNext()) { //按分隔符讀取字符串 String str = sc.next(); System.out.println(str); } } //sc.hasNextInt() 、hasNextFloat() 、基礎數據類型等等等等。 //文件內容:1|2 fileName = "D:\\data\\test\\newFile5.txt"; try (Scanner sc = new Scanner(new FileReader(fileName))) { sc.useDelimiter("\\|"); //分隔符 while (sc.hasNextInt()) { //按分隔符讀取Int int intValue = sc.nextInt(); System.out.println(intValue); } } } 

上面的方法輸出結果如下:

Hello World|Hello Zimug Hello World Hello Zimug 1 2 

2.Files.lines (Java 8)

如果你是需要按行去處理數據文件的內容,這種方式是我推薦大家去使用的一種方式,代碼簡潔,使用java 8的Stream流將文件讀取與文件處理有機融合。

@Test void testReadFile2() throws IOException { String fileName = "D:\\data\\test\\newFile.txt"; // 讀取文件內容到Stream流中,按行讀取 Stream<String> lines = Files.lines(Paths.get(fileName)); // 隨機行順序進行數據處理 lines.forEach(ele -> { System.out.println(ele); }); } 

forEach獲取Stream流中的行數據不能保證順序,但速度快。如果你想按順序去處理文件中的行數據,可以使用forEachOrdered,但處理效率會下降。

// 按文件行順序進行處理 lines.forEachOrdered(System.out::println); 

或者利用CPU多和的能力,進行數據的並行處理parallel(),適合比較大的文件。

// 按文件行順序進行處理 lines.parallel().forEachOrdered(System.out::println); 

也可以把Stream<String>轉換成List<String>,但是要注意這意味着你要將所有的數據一次性加載到內存,要注意java.lang.OutOfMemoryError

// 轉換成List<String>, 要注意java.lang.OutOfMemoryError: Java heap space List<String> collect = lines.collect(Collectors.toList()); 

3.Files.readAllLines

這種方法仍然是java8 為我們提供的,如果我們不需要Stream<String>,我們想直接按行讀取文件獲取到一個List<String>,就采用下面的方法。同樣的問題:這意味着你要將所有的數據一次性加載到內存,要注意java.lang.OutOfMemoryError

@Test
void testReadFile3() throws IOException { String fileName = "D:\\data\\test\\newFile3.txt"; // 轉換成List<String>, 要注意java.lang.OutOfMemoryError: Java heap space List<String> lines = Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8); lines.forEach(System.out::println); } 

4.Files.readString(JDK 11)

從 java11開始,為我們提供了一次性讀取一個文件的方法。文件不能超過2G,同時要注意你的服務器及JVM內存。這種方法適合快速讀取小文本文件。

@Test void testReadFile4() throws IOException { String fileName = "D:\\data\\test\\newFile3.txt"; // java 11 開始提供的方法,讀取文件不能超過2G,與你的內存息息相關 //String s = Files.readString(Paths.get(fileName)); } 

5.Files.readAllBytes()

如果你沒有JDK11(readAllBytes()始於JDK7),仍然想一次性的快速讀取一個文件的內容轉為String,該怎么辦?先將數據讀取為二進制數組,然后轉換成String內容。這種方法適合在沒有JDK11的請開給你下,快速讀取小文本文件。

@Test void testReadFile5() throws IOException { String fileName = "D:\\data\\test\\newFile3.txt"; //如果是JDK11用上面的方法,如果不是用這個方法也很容易 byte[] bytes = Files.readAllBytes(Paths.get(fileName)); String content = new String(bytes, StandardCharsets.UTF_8); System.out.println(content); } 

6.經典管道流的方式

最后一種就是經典的管道流的方式

@Test void testReadFile6() throws IOException { String fileName = "D:\\data\\test\\newFile3.txt"; // 帶緩沖的流讀取,默認緩沖區8k try (BufferedReader br = new BufferedReader(new FileReader(fileName))){ String line; while ((line = br.readLine()) != null) { System.out.println(line); } } //java 8中這樣寫也可以 try (BufferedReader br = Files.newBufferedReader(Paths.get(fileName))){ String line; while ((line = br.readLine()) != null) { System.out.println(line); } } } 

這種方式可以通過管道流嵌套的方式,組合使用,比較靈活。比如我們
想從文件中讀取java Object就可以使用下面的代碼,前提是文件中的數據是ObjectOutputStream寫入的數據,才可以用ObjectInputStream來讀取。

try (FileInputStream fis = new FileInputStream(fileName); ObjectInputStream ois = new ObjectInputStream(fis)){ ois.readObject(); } 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM