首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >逐行读取字符串

逐行读取字符串
EN

Stack Overflow用户
提问于 2009-07-08 07:34:24
回答 10查看 339.7K关注 0票数 157

给定一个不太长的字符串,逐行阅读它的最佳方法是什么?

我知道你能做到:

代码语言:javascript
复制
BufferedReader reader = new BufferedReader(new StringReader(<string>));
reader.readLine();

另一种方法是获取eol上的子字符串:

代码语言:javascript
复制
final String eol = System.getProperty("line.separator");
output = output.substring(output.indexOf(eol + 1));

有没有其他更简单的方法呢?我对上面的方法没有问题,只是想知道你们中是否有人知道一些看起来更简单和更有效的方法?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-07-08 07:38:00

也可以使用String的split方法:

代码语言:javascript
复制
String[] lines = myString.split(System.getProperty("line.separator"));

这为您提供了一个方便的数组中的所有行。

我不知道split的表现如何。它使用正则表达式。

票数 147
EN

Stack Overflow用户

发布于 2009-07-08 07:36:08

还有Scanner。您可以像使用BufferedReader一样使用它

代码语言:javascript
复制
Scanner scanner = new Scanner(myString);
while (scanner.hasNextLine()) {
  String line = scanner.nextLine();
  // process the line
}
scanner.close();

我认为这种方法比两种建议的方法都要干净一些。

票数 225
EN

Stack Overflow用户

发布于 2014-11-02 18:12:03

因为我对效率的角度特别感兴趣,所以我创建了一个小测试类(如下所示)。5,000,000行结果:

代码语言:javascript
复制
Comparing line breaking performance of different solutions
Testing 5000000 lines
Split (all): 14665 ms
Split (CR only): 3752 ms
Scanner: 10005
Reader: 2060

像往常一样,确切的时间可能会有所不同,但无论我运行它的频率如何,这个比率都是正确的。

结论: OP的“更简单”和“更高效”的需求不可能同时得到满足,split解决方案(无论是哪一种实现)都更简单,但是Reader实现无疑要比其他实现更好。

代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Test class for splitting a string into lines at linebreaks
 */
public class LineBreakTest {
    /** Main method: pass in desired line count as first parameter (default = 10000). */
    public static void main(String[] args) {
        int lineCount = args.length == 0 ? 10000 : Integer.parseInt(args[0]);
        System.out.println("Comparing line breaking performance of different solutions");
        System.out.printf("Testing %d lines%n", lineCount);
        String text = createText(lineCount);
        testSplitAllPlatforms(text);
        testSplitWindowsOnly(text);
        testScanner(text);
        testReader(text);
    }

    private static void testSplitAllPlatforms(String text) {
        long start = System.currentTimeMillis();
        text.split("\n\r|\r");
        System.out.printf("Split (regexp): %d%n", System.currentTimeMillis() - start);
    }

    private static void testSplitWindowsOnly(String text) {
        long start = System.currentTimeMillis();
        text.split("\n");
        System.out.printf("Split (CR only): %d%n", System.currentTimeMillis() - start);
    }

    private static void testScanner(String text) {
        long start = System.currentTimeMillis();
        List<String> result = new ArrayList<>();
        try (Scanner scanner = new Scanner(text)) {
            while (scanner.hasNextLine()) {
                result.add(scanner.nextLine());
            }
        }
        System.out.printf("Scanner: %d%n", System.currentTimeMillis() - start);
    }

    private static void testReader(String text) {
        long start = System.currentTimeMillis();
        List<String> result = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new StringReader(text))) {
            String line = reader.readLine();
            while (line != null) {
                result.add(line);
                line = reader.readLine();
            }
        } catch (IOException exc) {
            // quit
        }
        System.out.printf("Reader: %d%n", System.currentTimeMillis() - start);
    }

    private static String createText(int lineCount) {
        StringBuilder result = new StringBuilder();
        StringBuilder lineBuilder = new StringBuilder();
        for (int i = 0; i < 20; i++) {
            lineBuilder.append("word ");
        }
        String line = lineBuilder.toString();
        for (int i = 0; i < lineCount; i++) {
            result.append(line);
            result.append("\n");
        }
        return result.toString();
    }
}
票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1096621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档