java從文件中讀取數(shù)據(jù)的六種方法
本文主要介紹了java從文件中讀取數(shù)據(jù)的六種方法,分享給大家,具體如下:
- Scanner(Java 1.5) 按行讀數(shù)據(jù)及String、Int類型等按分隔符讀數(shù)據(jù)。
- Files.lines, 返回Stream(Java 8) 流式數(shù)據(jù)處理,按行讀取
- Files.readAllLines, 返回List(Java 8)
- Files.readString, 讀取String(Java 11), 文件最大 2G.
- Files.readAllBytes, 讀取byte[](Java 7), 文件最大 2G.
- BufferedReader, 經(jīng)典方式 (Java 1.1 -> forever)
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);
}
}
}
輸出為:
Hello World|Hello Zimug
Hello World
Hello Zimug
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);
也可以把Stream轉(zhuǎn)換成List,但是要注意這意味著你要將所有的數(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)
@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è)文件的方法。文件不能超過(guò)2G,同時(shí)要注意你的服務(wù)器及JVM內(nèi)存。這種方法適合快速讀取小文本文件。
@Test
void testReadFile4() throws IOException {
String fileName = "D:\\data\\test\\newFile3.txt";
// java 11 開始提供的方法,讀取文件不能超過(guò)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)典管道流的方式
@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);
}
}
}
這種方式可以通過(guò)管道流嵌套的方式,組合使用,比較靈活。比如我們 想從文件中讀取java Object就可以使用下面的代碼,前提是文件中的數(shù)據(jù)是ObjectOutputStream寫入的數(shù)據(jù),才可以用ObjectInputStream來(lái)讀取。
try (FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis)){
ois.readObject();
}
到此這篇關(guān)于java從文件中讀取數(shù)據(jù)的六種方法的文章就介紹到這了,更多相關(guān)java從文件中讀取數(shù)據(jù)的六種方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot詳解如何實(shí)現(xiàn)讀寫分離
當(dāng)響應(yīng)的瓶頸在數(shù)據(jù)庫(kù)的時(shí)候,就要考慮數(shù)據(jù)庫(kù)的讀寫分離,當(dāng)然還可以分庫(kù)分表,那是單表數(shù)據(jù)量特別大,當(dāng)單表數(shù)據(jù)量不是特別大,但是請(qǐng)求量比較大的時(shí)候,就要考慮讀寫分離了.具體的話,還是要看自己的業(yè)務(wù)...如果還是很慢,那就要分庫(kù)分表了...我們這篇就簡(jiǎn)單講一下讀寫分離2022-05-05
一文掌握Spring中循環(huán)依賴與三級(jí)緩存
這篇文章主要介紹了Spring中循環(huán)依賴與三級(jí)緩存,Spring通過(guò)三級(jí)緩存解決了循環(huán)依賴,其中一級(jí)緩存為單例池,二級(jí)緩存為早期曝光對(duì)象earlySingletonObjects,三級(jí)緩存為早期曝光對(duì)象工廠(singletonFactories),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧2023-09-09
Springboot項(xiàng)目平滑關(guān)閉及自動(dòng)化關(guān)閉腳本
這篇文章主要為大家詳細(xì)介紹了Springboot項(xiàng)目平滑關(guān)閉及自動(dòng)化關(guān)閉腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
SSH框架網(wǎng)上商城項(xiàng)目第12戰(zhàn)之添加和更新商品功能
這篇文章主要介紹了SSH框架網(wǎng)上商城項(xiàng)目第12戰(zhàn)之添加和更新商品功能的實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-06-06
詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法
本文主要介紹了詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

