如果您看完我的創(chuàng)作矮男,覺得您有幫助的話,請(qǐng)幫忙點(diǎn)贊承边,您的支持是我不竭的創(chuàng)作動(dòng)力遭殉!
1.Scanner
第一種方式是Scanner,從JDK1.5開始提供的API炒刁,特點(diǎn)是可以按行讀取恩沽、按分割符去讀取文件數(shù)據(jù),既可以讀取String類型翔始,也可以讀取Int類型、Long類型等基礎(chǔ)數(shù)據(jù)類型的數(shù)據(jù)里伯。
@Test
void testReadFile1() throws IOException {
? //文件內(nèi)容: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() 、基礎(chǔ)數(shù)據(jù)類型等等等等疾瓮。
? //文件內(nèi)容: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);
? ? ? }
? }
}
上面的方法輸出結(jié)果如下:
Hello World|Hello Zimug
Hello World
Hello Zimug
1
2
2.Files.lines (Java 8)
如果你是需要按行去處理數(shù)據(jù)文件的內(nèi)容脖镀,這種方式是我推薦大家去使用的一種方式,代碼簡(jiǎn)潔狼电,使用java 8的Stream流將文件讀取與文件處理有機(jī)融合蜒灰。
@Test
void testReadFile2() throws IOException {
? String fileName = "D:\\data\\test\\newFile.txt";
? // 讀取文件內(nèi)容到Stream流中,按行讀取
? Stream<String> lines = Files.lines(Paths.get(fileName));
? // 隨機(jī)行順序進(jìn)行數(shù)據(jù)處理
? lines.forEach(ele -> {
? ? ? System.out.println(ele);
? });
}
forEach獲取Stream流中的行數(shù)據(jù)不能保證順序肩碟,但速度快强窖。如果你想按順序去處理文件中的行數(shù)據(jù),可以使用forEachOrdered削祈,但處理效率會(huì)下降翅溺。
// 按文件行順序進(jìn)行處理
lines.forEachOrdered(System.out::println);
或者利用CPU多和的能力,進(jìn)行數(shù)據(jù)的并行處理parallel()髓抑,適合比較大的文件咙崎。
// 按文件行順序進(jìn)行處理
lines.parallel().forEachOrdered(System.out::println);
也可以把Stream<String>轉(zhuǎn)換成List<String>,但是要注意這意味著你要將所有的數(shù)據(jù)一次性加載到內(nèi)存,要注意java.lang.OutOfMemoryError
// 轉(zhuǎn)換成List<String>, 要注意java.lang.OutOfMemoryError: Java heap space
List<String> collect = lines.collect(Collectors.toList());
3.Files.readAllLines
這種方法仍然是java8 為我們提供的吨拍,如果我們不需要Stream<String>,我們想直接按行讀取文件獲取到一個(gè)List<String>褪猛,就采用下面的方法。同樣的問題:這意味著你要將所有的數(shù)據(jù)一次性加載到內(nèi)存羹饰,要注意java.lang.OutOfMemoryError
@Test
void testReadFile3() throws IOException {
? String fileName = "D:\\data\\test\\newFile3.txt";
? // 轉(zhuǎn)換成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開始伊滋,為我們提供了一次性讀取一個(gè)文件的方法。文件不能超過2G严里,同時(shí)要注意你的服務(wù)器及JVM內(nèi)存新啼。這種方法適合快速讀取小文本文件。
@Test
void testReadFile4() throws IOException {
? String fileName = "D:\\data\\test\\newFile3.txt";
? // java 11 開始提供的方法刹碾,讀取文件不能超過2G燥撞,與你的內(nèi)存息息相關(guān)
? //String s = Files.readString(Paths.get(fileName));
}
5.Files.readAllBytes()
如果你沒有JDK11(readAllBytes()始于JDK7),仍然想一次性的快速讀取一個(gè)文件的內(nèi)容轉(zhuǎn)為String,該怎么辦?先將數(shù)據(jù)讀取為二進(jìn)制數(shù)組物舒,然后轉(zhuǎn)換成String內(nèi)容色洞。這種方法適合在沒有JDK11的請(qǐng)開給你下,快速讀取小文本文件冠胯。
@Test
void testReadFile5() throws IOException {
? String fileName = "D:\\data\\test\\newFile3.txt";
? //如果是JDK11用上面的方法火诸,如果不是用這個(gè)方法也很容易
? byte[] bytes = Files.readAllBytes(Paths.get(fileName));
? String content = new String(bytes, StandardCharsets.UTF_8);
? System.out.println(content);
}
6.經(jīng)典管道流的方式
最后一種就是經(jīng)典的管道流的方式
@Test
void testReadFile6() throws IOException {
? String fileName = "D:\\data\\test\\newFile3.txt";
? // 帶緩沖的流讀取,默認(rèn)緩沖區(qū)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就可以使用下面的代碼悉盆,前提是文件中的數(shù)據(jù)是ObjectOutputStream寫入的數(shù)據(jù)盯荤,才可以用ObjectInputStream來讀取。
try (FileInputStream fis = new FileInputStream(fileName);
? ? ObjectInputStream ois = new ObjectInputStream(fis)){
? ois.readObject();
}
深圳網(wǎng)站優(yōu)化www.zg886.cn