最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)一行一行讀取文本的多種方法詳解

 更新時間:2025年10月10日 08:35:27   作者:VipSoft  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)一行一行讀取文本的多種方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以了解下

在Java中,有多種方式可以一行一行地讀取文本。以下是幾種常用的方法:

1. 使用 BufferedReader + FileReader

String str = "A\n" + "B\n" + "C";

// 方法1:從字符串讀取
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

// 方法2:從文件讀取
try (BufferedReader reader = new BufferedReader(new FileReader("filename.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

2. 使用 Scanner

String str = "A\n" + "B\n" + "C";

// 從字符串讀取
try (Scanner scanner = new Scanner(str)) {
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        System.out.println(line);
    }
}

// 從文件讀取
try (Scanner scanner = new Scanner(new File("filename.txt"))) {
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        System.out.println(line);
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

3. 使用 Files.lines() (Java 8+)

String str = "A\n" + "B\n" + "C";

// 從字符串讀?。ㄐ枰葘懭肱R時文件)
try {
    Path tempFile = Files.createTempFile("temp", ".txt");
    Files.write(tempFile, str.getBytes());
    
    Files.lines(tempFile).forEach(System.out::println);
    
    // 清理臨時文件
    Files.deleteIfExists(tempFile);
} catch (IOException e) {
    e.printStackTrace();
}

// 從文件讀取
try {
    Files.lines(Paths.get("filename.txt")).forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

4. 使用 String 的 split() 方法(適用于字符串)

String str = "A\n" + "B\n" + "C";

String[] lines = str.split("\n");
for (String line : lines) {
    System.out.println(line);
}

//處理空行
String[] lines = str.split("\\r?\\n|\\r");
List<String> nonEmptyLines = Arrays.stream(lines)
                                  .filter(line -> !line.trim().isEmpty())
                                  .collect(Collectors.toList());

5. 使用 Lines() 方法 (Java 11+)

String str = "A\n" + "B\n" + "C";

// 從字符串讀取
str.lines().forEach(System.out::println);

推薦方案

  • 對于字符串:使用 str.lines() (Java 11+) 或 split("\n")
  • 對于文件:使用 Files.lines() (Java 8+) 或 BufferedReader
  • 需要更多控制:使用 Scanner

最簡潔的方式是使用 Java 11 的 lines() 方法:

String str = "A\n" + "B\n" + "C";
str.lines().forEach(System.out::println);

輸出結(jié)果:

A
B
C

在 Java 8 環(huán)境下,split("\n")BufferedReader 各有優(yōu)缺點(diǎn),具體選擇取決于使用場景:

性能對比

1.split("\n")- 適用于小文本

String str = "A\n" + "B\n" + "C";
String[] lines = str.split("\n");
for (String line : lines) {
    System.out.println(line);
}

優(yōu)點(diǎn):

  • 代碼簡潔,一行搞定
  • 適合已知內(nèi)容較小的字符串
  • 可以直接得到數(shù)組,方便后續(xù)處理

缺點(diǎn):

  • 一次性加載所有內(nèi)容到內(nèi)存,大文本會占用大量內(nèi)存
  • 需要處理尾部的空行問題

2.BufferedReader- 適用于大文本或文件

String str = "A\n" + "B\n" + "C";
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

優(yōu)點(diǎn):

  • 內(nèi)存效率高,逐行讀取,適合大文件
  • 自動處理不同操作系統(tǒng)的換行符(\n, \r\n, \r
  • 統(tǒng)一的接口處理字符串和文件

缺點(diǎn):

  • 代碼相對冗長
  • 需要處理異常

推薦選擇

場景 1:小文本,內(nèi)容已知且不大

// 使用 split("\n")
String[] lines = str.split("\n");
Arrays.stream(lines).forEach(System.out::println);

場景 2:大文本或需要處理文件

// 使用 BufferedReader
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {
    reader.lines().forEach(System.out::println); // Java 8 Stream API
} catch (IOException e) {
    e.printStackTrace();
}

場景 3:Java 8 更優(yōu)雅的寫法

// 結(jié)合 BufferedReader 和 Stream API
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {
    List<String> lines = reader.lines().collect(Collectors.toList());
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

實(shí)際建議

對于你的具體案例:

String str = "A\n" + "B\n" + "C";

// 如果確定文本很小,用 split 更簡潔
String[] lines = str.split("\n");
for (String line : lines) {
    System.out.println(line);
}

// 如果要養(yǎng)成好習(xí)慣或處理可能的大文本,用 BufferedReader
try (BufferedReader reader = new BufferedReader(new StringReader(str))) {
    reader.lines().forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

總結(jié): 對于你當(dāng)前的小例子,split("\n") 完全足夠且更簡潔。但如果考慮到代碼的可擴(kuò)展性和健壯性,BufferedReader 是更好的選擇。

Scanner 相比 BufferedReader 提供了更豐富的文本解析功能,主要在數(shù)據(jù)類型解析和分隔符控制方面有優(yōu)勢。

Scanner 的額外控制能力

1. 數(shù)據(jù)類型自動解析

String data = "John 25 78.5 true\nAlice 30 65.2 false";

try (Scanner scanner = new Scanner(data)) {
    while (scanner.hasNext()) {
        if (scanner.hasNextInt()) {
            int age = scanner.nextInt();
            System.out.println("年齡: " + age);
        } else if (scanner.hasNextDouble()) {
            double weight = scanner.nextDouble();
            System.out.println("體重: " + weight);
        } else if (scanner.hasNextBoolean()) {
            boolean status = scanner.nextBoolean();
            System.out.println("狀態(tài): " + status);
        } else {
            String name = scanner.next();
            System.out.println("姓名: " + name);
        }
    }
}

2. 靈活的分隔符控制

String csvData = "A,B,C\n1,2,3\nX,Y,Z";

// 使用逗號作為分隔符
try (Scanner scanner = new Scanner(csvData)) {
    scanner.useDelimiter(",|\n"); // 逗號或換行符作為分隔符
    
    while (scanner.hasNext()) {
        String token = scanner.next();
        System.out.println("Token: " + token);
    }
}

3. 模式匹配(正則表達(dá)式)

String text = "價格: $25.50, 重量: 1.5kg, 日期: 2023-01-01";

try (Scanner scanner = new Scanner(text)) {
    // 查找價格模式
    String pricePattern = "\\$\\d+\\.\\d+";
    while (scanner.hasNext(pricePattern)) {
        String price = scanner.next(pricePattern);
        System.out.println("找到價格: " + price);
    }
    
    // 重置Scanner查找其他模式
    scanner = new Scanner(text);
    String datePattern = "\\d{4}-\\d{2}-\\d{2}";
    if (scanner.hasNext(datePattern)) {
        String date = scanner.next(datePattern);
        System.out.println("找到日期: " + date);
    }
}

4. 區(qū)域設(shè)置和數(shù)字格式

String europeanData = "1.234,56 2.345,67"; // 歐洲數(shù)字格式

try (Scanner scanner = new Scanner(europeanData)) {
    scanner.useLocale(Locale.GERMANY); // 使用德國區(qū)域設(shè)置
    
    while (scanner.hasNextDouble()) {
        double number = scanner.nextDouble();
        System.out.println("數(shù)字: " + number);
    }
}

5. 精確的輸入驗(yàn)證

String input = "123 456 abc 789";

try (Scanner scanner = new Scanner(input)) {
    // 精確控制輸入類型
    if (scanner.hasNextInt()) {
        int first = scanner.nextInt(); // 123
    }
    if (scanner.hasNextInt()) {
        int second = scanner.nextInt(); // 456
    }
    if (scanner.hasNext("abc")) {
        String text = scanner.next(); // abc
    }
    if (scanner.hasNextInt()) {
        int third = scanner.nextInt(); // 789
    }
}

與 BufferedReader 的對比

特性ScannerBufferedReader
數(shù)據(jù)類型解析? 自動解析 int, double, boolean 等? 只能返回 String
分隔符控制? 高度可配置,支持正則表達(dá)式? 固定按行讀取
模式匹配? 支持正則表達(dá)式模式匹配? 不支持
區(qū)域設(shè)置? 支持不同地區(qū)的數(shù)字格式? 不支持
性能? 相對較慢? 更快
內(nèi)存使用? 緩沖區(qū)較小? 緩沖區(qū)可配置
簡單行讀取? 支持但較慢? 專門優(yōu)化

使用場景建議

使用 Scanner 的場景

// 解析結(jié)構(gòu)化數(shù)據(jù)
String studentData = "張三 20 計算機(jī) 85.5";
try (Scanner scanner = new Scanner(studentData)) {
    String name = scanner.next();
    int age = scanner.nextInt();
    String major = scanner.next();
    double score = scanner.nextDouble();
}

// 解析CSV數(shù)據(jù)
String csv = "1,蘋果,5.5\n2,香蕉,3.2";
try (Scanner scanner = new Scanner(csv)) {
    scanner.useDelimiter(",|\n");
    while (scanner.hasNext()) {
        // 按字段解析
    }
}

使用 BufferedReader 的場景

// 簡單逐行讀取大文件
try (BufferedReader reader = new BufferedReader(new FileReader("largefile.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        // 處理每一行
    }
}

// 性能要求高的場景
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"), 8192)) {
    // 使用更大的緩沖區(qū)
}

什么時候該用 BufferedReader

只有當(dāng)文本規(guī)模達(dá)到以下程度時才需要考慮:

  • 行數(shù):成千上萬行
  • 文件大小:幾十MB以上
  • 內(nèi)存敏感:在移動設(shè)備或內(nèi)存受限環(huán)境

總結(jié)

選擇 Scanner 當(dāng)需要:

  • 自動數(shù)據(jù)類型轉(zhuǎn)換
  • 復(fù)雜的分隔符邏輯
  • 正則表達(dá)式模式匹配
  • 解析結(jié)構(gòu)化文本數(shù)據(jù)

選擇 BufferedReader 當(dāng)需要:

  • 高性能的簡單行讀取
  • 處理大文件
  • 最小內(nèi)存占用
  • 簡單的文本處理

對于你的原始需求(一行一行讀取文本),如果只是簡單讀取,BufferedReader 性能更好;如果需要解析每行的數(shù)據(jù)內(nèi)容,Scanner 更合適。

以上就是Java實(shí)現(xiàn)一行一行讀取文本的多種方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java按行讀取文本的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)酷狗音樂臨時緩存文件轉(zhuǎn)換為MP3文件的方法

    java實(shí)現(xiàn)酷狗音樂臨時緩存文件轉(zhuǎn)換為MP3文件的方法

    這篇文章主要介紹了java實(shí)現(xiàn)酷狗音樂臨時緩存文件轉(zhuǎn)換為MP3文件的方法,涉及java針對文件操作的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • 配置化Feign接口動態(tài)切換URL方式

    配置化Feign接口動態(tài)切換URL方式

    本文介紹了在開發(fā)、測試和生產(chǎn)環(huán)境中使用Feign接口時,根據(jù)不同的環(huán)境動態(tài)切換調(diào)用URL的方法,通過在不同環(huán)境的配置文件中配置URL,并實(shí)現(xiàn)一個Feign攔截器來讀取這些配置,從而實(shí)現(xiàn)URL的動態(tài)切換,這種方法避免了引入過多步驟,同時也保證了不同環(huán)境下的URL正確調(diào)用
    2024-11-11
  • 在idea中使用JaCoCo插件統(tǒng)計單元測試覆蓋率的實(shí)現(xiàn)

    在idea中使用JaCoCo插件統(tǒng)計單元測試覆蓋率的實(shí)現(xiàn)

    這篇文章主要介紹了在idea中使用JaCoCo插件統(tǒng)計單元測試覆蓋率的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Dubbo之SPI機(jī)制的實(shí)現(xiàn)原理和優(yōu)勢分析

    Dubbo之SPI機(jī)制的實(shí)現(xiàn)原理和優(yōu)勢分析

    這篇文章主要介紹了Dubbo之SPI機(jī)制的實(shí)現(xiàn)原理和優(yōu)勢,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • JavaBean實(shí)體類處理外鍵過程解析

    JavaBean實(shí)體類處理外鍵過程解析

    這篇文章主要介紹了JavaBean實(shí)體類處理外鍵過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Spring Boot事務(wù)配置詳解

    Spring Boot事務(wù)配置詳解

    這篇文章主要介紹了Spring Boot事務(wù)配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • File的API和常用方法詳解_動力節(jié)點(diǎn)Java學(xué)院整理

    File的API和常用方法詳解_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了File的API和常用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • SSM框架整合之junit測試的方法

    SSM框架整合之junit測試的方法

    本篇文章主要介紹了SSM框架整合之junit測試的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java多線程編程小實(shí)例模擬停車場系統(tǒng)

    Java多線程編程小實(shí)例模擬停車場系統(tǒng)

    這是一個關(guān)于Java多線程編程的例子,用多線程的思想模擬停車場管理系統(tǒng),這里分享給大家,供需要的朋友參考。
    2017-10-10
  • springboot集成redis啟動報錯問題的解決方式

    springboot集成redis啟動報錯問題的解決方式

    這篇文章主要介紹了springboot集成redis啟動報錯問題的解決方式,從錯誤信息上看缺少pool2相關(guān)包,查詢資料發(fā)現(xiàn)當(dāng)redis客戶端選擇Lettuce時候需要增加:commons-pool2
    添加引用,重啟服務(wù),需要的朋友可以參考下
    2023-11-11

最新評論

仙居县| 栾川县| 从化市| 佛坪县| 嘉义县| 旌德县| 宁南县| 西青区| 新宾| 衢州市| 类乌齐县| 沅陵县| 恭城| 依安县| 海宁市| 类乌齐县| 陵川县| 乌海市| 台安县| 新沂市| 莲花县| 顺义区| 庄浪县| 伊宁县| 达尔| 金山区| 永康市| 华坪县| 江永县| 南乐县| 武汉市| 林甸县| 茌平县| 巴林右旗| 乐安县| 漯河市| 堆龙德庆县| 临西县| 西林县| 台北市| 揭阳市|