如何逐行读取字符串生成器

Posted

技术标签:

【中文标题】如何逐行读取字符串生成器【英文标题】:How to read String Builder line by line 【发布时间】:2011-11-03 15:34:29 【问题描述】:

我可以逐行阅读 String Builder 吗?并获取每行的长度。


编辑:

我在 StringBuilder 中构建字符串并在其中添加“\n”。我需要再次阅读它。我需要考虑每个“\n”都有一个新行。” p>

【问题讨论】:

AFAIK,StringBuilder 中没有 line 的概念。这只是一个字符序列。话虽如此,您能详细说明一下吗? 我在 StringBuilder 中构建字符串并在其中添加“\n”。我需要再读一遍。我需要考虑每个“\n”都有一个新行。 @Ran,谢谢,但这类信息应该在最初的问题中。这是一个非常重要的细节! 哦。我应该包括它..对不起 @user647772 我有一个装满数据的 StringBuilder。我想读它。为什么这很难理解? 【参考方案1】:

根据您的编辑,只需在StringBuilder 实例上调用toString(),然后在返回的String 实例上调用split("\\n") 即可。从那里,您将拥有一个 String 数组,您可以循环访问该数组以访问 StringBuilder 实例的每一“行”。当然,在每个 String 实例上调用 length() 或“行”以获取其长度。


StringBuilder sb = new StringBuilder();
sb.append("line 1");
sb.append("\\n");
sb.append("line 2");

String[] lines = sb.toString().split("\\n");
for(String s: lines)
    System.out.println("Content = " + s);
    System.out.println("Length = " + s.length());

【讨论】:

@Ran, split 返回一个 String 数组。 你能给我举个例子吗?使用这个字符串 x = firstLayer.fullbinary.toString(); x.split("\\n");对不起,我只是一个初学者。【参考方案2】:

制作一个 Scanner 对象,您可以轻松地逐行解析并获取长度。

Scanner scan = new Scanner(sb.toString()); // I have named your StringBuilder object sb
while (scan.hasNextLine() )
 String oneLine = scan.nextLine();
 System.out.println(oneLine.length());

【讨论】:

这是什么:String Builder object? @Tichodroma 这是他要处理的 String Builder 对象实例的引用变量名。 我不认为这是合法的 Java 语法。 我绝对确定它不是 :) 如果你愿意,我可以将其更改为 sb,但我之所以这样写是因为伪代码用于解释。【参考方案3】:

正如已经回答的那样,在简单的情况下,您可以使用toString().split()。如果您想要一些更灵活并且还支持行删除的东西,只需跟踪您返回的最后一行的开始值和结束值即可迭代行非常简单:

    new Iterator<String>() 
      boolean hasNext = true;
      boolean removed = false;
      int start = 0;
      int end = -1;
      @Override public boolean hasNext() 
        return hasNext;
      

      @Override public String next() 
        removed = false;
        if (!hasNext) 
          throw new NoSuchElementException();
        
        start = end + 1;
        end = value.indexOf("\n", start);
        if (end == -1) 
          hasNext = false;
        
        return value.substring(
            start,
            end == -1 ? value.length() : end);
      

      @Override public void remove() 
        if (removed) 
          throw new IllegalStateException("Multiple calls to remove() without and intervening call to next().");
        
        value.delete(
            start,
            end == -1 ? value.length() : end + 1);
        end = start - 1;
        removed = true;
      
    ;

您可以在一个实用程序类中看到这一点,该类在此处为 String 或 StringBuilder 返回 LineIterator:http://pastebin.com/JA6abTg3

它有测试显示如何在这里使用它:http://pastebin.com/X1b5cGX8

【讨论】:

【参考方案4】:

不确定您要做什么,但您可以在其上调用toString().split() 以获取数组。您可以按行分隔符进行拆分。

【讨论】:

【参考方案5】:

我认为没有方法可以逐行读取 stringbuilder。 但是,如果您想逐行分隔整个字符串,则可以在 StringBuilder 中附加字符串时添加换行符 ""\n""。

【讨论】:

【参考方案6】:

使用 ("\n");,当您附加到字符串生成器时。 这是简单的做法。

【讨论】:

【参考方案7】:

我意识到我在几年后才回复,但遇到了同样的问题。

与其使用 Split() 等来玩这些游戏,不如只构建一个字符串列表?

Dim Lines = New List(of String)
Dim Length As Integer

Lines.Add("The quick brown fox jumped over the lazy dog's back.")
Lines.Add("The slow turtle crawled down the grassy lane.")

For Each Line in Lines
  Length = Line.Length
  Debug.WriteLine("Length = " + Length)
Next

【讨论】:

以上是关于如何逐行读取字符串生成器的主要内容,如果未能解决你的问题,请参考以下文章

如何逐行读取大型文本文件,而不将其加载到内存中?

scanf 从生成的字符串

如何逐行读取字符串[重复]

Java - 逐行读取文件直到文件末尾

C++文件读写操作逐字符读取文本和逐行读取文本

如何逐行读取批处理文件中多余字符的文本文件?允许限制行长。(Windows,批处理脚本)