Как удалить разрывы строк из файла в Java?

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

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

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

но это не работает.

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

Ответ 1

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

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

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

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

Ответ 2

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


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

// #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. Однако, если входной файл является текстом, это объединит слова; например,

Goodbye cruel
world.

становится

Goodbye cruelworld.

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

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

который заменяет каждый разделитель строки пробелом. Начиная с Java 8 вы также можете сделать это:

// #5
text = text.replaceAll("\\R", " ");

И если вы хотите заменить несколько разделителей строк одним пробелом:

// #6
text = text.replaceAll("\\R+", " ");

Ответ 3

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

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

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

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

Или, немного более подробный, но меньше regexy:

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

Ответ 4

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

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);

Ответ 5

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

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

Ответ 6

Это было бы эффективно, я думаю,

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

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

Ответ 7

Линейные строки не совпадают с окнами /linux/mac. Вы должны использовать System.getProperties с атрибутом line.separator.

Ответ 8

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

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

Ответ 9

Вы можете прочитать свой файл с помощью 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() не включает терминатор строки в возвращаемой строке. В приведенном выше коде добавляется пространство, чтобы избежать склеивания последнего слова строки и первого слова следующей строки.

Ответ 10

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

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

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

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

Ответ 11

Мне показалось странным, что (StringUtils еще не был рассмотрен.

вы можете удалить все строки новой строки (или любые другие вхождения подстроки, если это важно) из строки, используя метод .replace

StringUtils.replace(myString, "\n", "");

Эта строка заменит все символы новой строки пустой строкой.

поскольку новая строка технически является символом, который вы можете использовать с помощью метода .replaceChars, который заменит символы

StringUtils.replaceChars(myString, '\n', '');

Ответ 12

Вы можете использовать apache commons IOUtils для итерации по строке и добавления каждой строки в StringBuilder. И не забудьте закрыть InputStream

StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
  sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);

Ответ 13

FYI, если вы можете захотеть заменить одновременные мути-линии с разрывом одной строки, вы можете использовать

myString.trim().replaceAll("[\n]{2,}", "\n")

Или замените одним пробелом

myString.trim().replaceAll("[\n]{2,}", " ")

Ответ 14

Вы можете использовать общие методы для замены любого char любым char.

public static void removeWithAnyChar(String str, char replceChar,
        char replaceWith) {
    char chrs[] = str.toCharArray();
    int i = 0;
    while (i < chrs.length) {

        if (chrs[i] == replceChar) {
            chrs[i] = replaceWith;
        }
        i++;
    }

}

Ответ 15

org.apache.commons.lang.StringUtils # chopNewline

Ответ 16

Попробуйте сделать это:

 textValue= textValue.replaceAll("\n", "");
 textValue= textValue.replaceAll("\t", "");
 textValue= textValue.replaceAll("\\n", "");
 textValue= textValue.replaceAll("\\t", "");
 textValue= textValue.replaceAll("\r", "");
 textValue= textValue.replaceAll("\\r", "");
 textValue= textValue.replaceAll("\r\n", "");
 textValue= textValue.replaceAll("\\r\\n", "");