Учитывая строку, которая не слишком длинная, как лучше всего читать ее построчно?
Я знаю, что вы можете сделать:
BufferedReader reader = new BufferedReader(new StringReader(<string>));
reader.readLine();
Другой способ - взять подстроку в eol:
final String eol = System.getProperty("line.separator");
output = output.substring(output.indexOf(eol + 1));
Есть ли другие, может быть, более простые способы сделать это? У меня нет проблем с вышеуказанными подходами, просто интересно узнать, знает ли кто-нибудь из вас что-то, что может выглядеть проще и эффективнее?
Ответы:
Вы также можете использовать
split
метод String:Это дает вам все строки в удобном массиве.
Я не знаю о производительности раскола. Он использует регулярные выражения.
источник
line.separator
а кто-то другой читает ее на Windows с помощьюline.separator
, она все еще перегружена. Это не некомпетентные программисты, которые делают глупости, просто то, как все (не всегда) работает.Есть также
Scanner
. Вы можете использовать его так же, какBufferedReader
:Я думаю, что это немного более чистый подход, чем оба предложенных.
источник
Поскольку меня особенно интересовал угол эффективности, я создал небольшой тестовый класс (ниже). Результат на 5 000 000 строк:
Как обычно, точное время может отличаться, но соотношение сохраняется, однако я часто его использую.
Вывод: «более простые» и «более эффективные» требования OP не могут быть удовлетворены одновременно,
split
решение (в любом воплощении) является более простым, ноReader
реализация опускает другие руки вниз.источник
lines()
функцию, возвращающуюStream<String>
строки, которые вы можете собрать в список, если хотите, или обработать поток.Используя Apache Commons IOUtils, вы можете сделать это красиво через
Это не делает ничего умного, но это красиво и компактно. Он также будет обрабатывать потоки, и вы можете получить его,
LineIterator
если хотите.источник
IOUtils.readlines(Reader)
выбрасываетIOException
. Даже если это никогда не произойдет с StringReader, вам придется его перехватить или объявить.Решение с использованием
Java 8
таких функций, какStream API
иMethod references
или
источник
Начиная с Java 11, появился новый метод
String.lines
:Использование:
источник
Вы можете использовать потоковый API и StringReader, обернутый в BufferedReader, который получил поток lines () в java 8:
дает
Как и в readLine BufferedReader, сами символы новой строки не включены. Поддерживаются все виды разделителей новой строки (даже в одной строке).
источник
Вы также можете использовать:
Если это не сработает, попробуйте заменить
\n
на\r\n
.источник
Или используйте новую попытку с предложением ресурсов в сочетании со Scanner:
источник
Вы можете попробовать следующее регулярное выражение:
Код:
Вывод:
источник
Самый простой и универсальный подход - просто использовать регулярное выражение,
Linebreak matcher
\R
которое соответствуетAny Unicode linebreak sequence
:@ смотри https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html
источник