Как удалить разрывы строк из файла в Java? - PullRequest
231 голосов
/ 29 января 2010

Как я могу заменить все разрывы строк из строки в Java таким образом, чтобы это работало в Windows и Linux (т. Е. Без особых проблем ОС при возврате каретки / переводе строки / новой строке и т. Д.)?

Я пробовал (обратите внимание, что readFileAsString - это функция, которая считывает текстовый файл в строку):

String text = readFileAsString("textfile.txt");
text.replace("\n", "");

но это, похоже, не работает.

Как это можно сделать?

Ответы [ 16 ]

386 голосов
/ 29 января 2010

Вам необходимо установить text на результаты text.replace():

String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

Это необходимо, потому что строки неизменны - вызов replace не меняет исходную строку, она возвращает новую, которая была изменена. Если вы не назначите результат для text, то эта новая строка будет потеряна, а мусор будет собран.

Что касается получения строки новой строки для любой среды - это можно получить, позвонив по номеру System.getProperty("line.separator").

197 голосов
/ 29 января 2010

Как отмечалось в других ответах, ваш код не работает в основном , поскольку String.replace(...) не изменяет целевую строку. (Это невозможно - строки Java являются неизменяемыми!) На самом деле он создает новую строку с символами, измененными по мере необходимости. Но тогда ваш код выбрасывает эту строку ...


Вот несколько возможных решений. Какой из них наиболее правильный, зависит от того, что именно вы пытаетесь сделать.

// #1
text = text.replace("\n", "");

Просто удаляет все символы новой строки. Это не справляется с завершением строки в Windows или Mac.

// #2
text = text.replace(System.getProperty("line.separator"), "");

Удаляет все линейные терминаторы для текущей платформы. Это не относится к случаю, когда вы пытаетесь обработать (например) файл UNIX в Windows или наоборот.

// #3
text = text.replaceAll("\\r|\\n", "");

Удаляет все разделители строк в Windows, UNIX или Mac. Однако, если входной файл является текстом, это объединит слова; например, * 1 016 *

Goodbye cruel
world.

становится

Goodbye cruelworld.

Так что вы действительно можете сделать это:

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");

, который заменяет каждый разделитель строки пробелом.

19 голосов
/ 29 января 2010

Если вы хотите удалить только ограничители строки, которые действительны в текущей ОС, вы можете сделать это:

text = text.replaceAll(System.getProperty("line.separator"), "");

Если вы хотите удалить все разделители строк, вы можете сделать это следующим образом:

text = text.replaceAll("\\r|\\n", "");

Или, немного более многословный, но менее регулярный:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
11 голосов
/ 29 апреля 2017

Эта функция нормализует все пробелы, включая разрывы строк, до одиночных пробелов. Не совсем то, о чем просил первоначальный вопрос, но, скорее всего, во многих случаях он будет делать именно то, что нужно:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
10 голосов
/ 25 июля 2014
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

Отлично сработал для меня после долгих поисков, потерпев неудачу с любой другой строкой.

9 голосов
/ 09 марта 2013

Думаю, это будет эффективно

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")

отредактировано для подсветки синтаксиса

6 голосов
/ 29 января 2010

Разрывы строк не совпадают в Windows / Linux / Mac. Вы должны использовать System.getProperties с атрибутом line.separator.

3 голосов
/ 31 августа 2012
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

Несмотря на то, что определение trim () на веб-сайте Oracle Msgstr "Возвращает копию строки, пропуская начальные и конечные пробелы."

В документации не сказано, что символы новой строки (начальные и конечные) также будут удалены.

Короче String text = readFileAsString("textfile.txt").trim(); также будет работать для вас. (Проверено с Java 6)

3 голосов
/ 29 января 2010

Возможно, вы захотите прочитать ваш файл с BufferedReader. Этот класс может разбивать ввод на отдельные строки, которые вы можете собрать по желанию. Способ работы BufferedReader автоматически распознает соглашения о конце строк в мире Linux, Windows и MacOS, независимо от текущей платформы.

Таким образом:

BufferedReader br = new BufferedReader(
    new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
    String line = br.readLine();
    if (line == null)
        break;
    sb.append(line);
    sb.append(' ');   // SEE BELOW
}
String text = sb.toString();

Обратите внимание, что readLine() не включает терминатор строки в возвращаемой строке. Приведенный выше код добавляет пробел, чтобы избежать склеивания последнего слова строки и первого слова следующей строки.

3 голосов
/ 29 января 2010
String text = readFileAsString("textfile.txt").replace("\n","");

.replace возвращает новую строку, строки в Java неизменны.

...