Ответ 1
Вы можете использовать:
BufferedReader bufReader = new BufferedReader(new StringReader(textContent));
И используйте метод readLine()
:
String line=null;
while( (line=bufReader.readLine()) != null )
{
}
В настоящее время я использую что-то вроде:
String[]lines = textContent.split(System.getProperty("line.separator"));
for(String tmpLine : lines){
//do something
}
Я не очень доволен этим методом, потому что он создает тяжелый массив (пусть textContent
может содержать книгу).
Есть ли лучшее решение для итерации по строкам String
?
Вы можете использовать:
BufferedReader bufReader = new BufferedReader(new StringReader(textContent));
И используйте метод readLine()
:
String line=null;
while( (line=bufReader.readLine()) != null )
{
}
Чтобы добавить способ Java 8 к этому вопросу:
Arrays.stream(content.split("\\r?\\n")).forEach(line -> /*do something */)
Из проклятия вы также можете использовать System.lineSeparator()
для разделения, если вы уверены, что файл отправляется из той же формы, что и vm.
Или даже лучше использовать поток api еще более агрессивно с фильтром, отобразить и собрать:
String result = Arrays.stream(content.split(System.lineSeparator()))
.filter(/* filter for lines you are interested in*/)
.map(/*convert string*/)
.collect(Collectors.joining(";"));
Вы можете использовать String.indexOf()/String.substring()
String separator = System.getProperty("line.separator");
int index = textContent.indexOf(separator);
while (index > 0)
{
int nextIndex = textContent.indexOf(separator, index + separator.length());
String line = textContent.substring(index + separator.length(), nextIndex);
// do something with line.
}
Guava Splitter работает хорошо. Тем более, что вы можете удалить пустые строки
Splitter splitter = Splitter.on(System.getProperty("line.separator"))
.trimResults()
.omitEmptyStrings();
for (String line : splitter.split(input)){
// do work here
}
Как насчет класса java.util.Scanner
?
Вкратце:
Простой текстовый сканер, который может анализировать примитивные типы и строки используя регулярные выражения.
Сканер разбивает свой вход на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу. В результате токены могут быть преобразуются в значения разных типов, используя различные следующие Методы.
и примечания для вашего сценария:
Сканер также может использовать разделители, отличные от пробелов. Эта пример читает несколько элементов из строки:
String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close();
используйте BufferedReader с аргументом StringReader. BufferedReader имеет метод readLine(), чтобы вы могли читать строку за строкой.
StringReader reader = new StringReader(myBigTextString);
BufferedReader br = new BufferedReader(reader);
String line;
while((line=br.readLine())!=null)
{
//do what you want
}
Объединить java.io.StringReader
и java.io.LineNumberReader
На самом деле вы можете прервать Scanner
, чтобы вы могли использовать обычный цикл for
:
import java.util.Scanner;
public class IterateLines {
public static void main(String[] args) {
Iterable<String> sc = () ->
new Scanner("foo bar\nbaz\n").useDelimiter("\n");
for (String line: sc) {
System.out.println(line);
}
}
}
дает нам:
$ javac IterateLines.java && java IterateLines
foo bar
baz