Перевод текста в одну строку

239
03 апреля 2017, 06:02

Код программы считывает информацию из файла и переводит его в строку:

public static void main(String[] args) throws FileNotFoundException, IOException {
    Reader reader = new FileReader(args[0]);
    String buf = "";
    while (reader.ready())
    {
        int data = reader.read();
        buf = buf + (char)data;
    }
    buf = buf.replace('\n', ' ');

Проблема в последней строке. Без нее переменная buf отображает текст файла адекватно.

Текст файла:

Petrov 2.7
Sidorov 3.15
Petrov 5
Varez 3.1
Kirk 9

Переменная buf без метода replace выводит в консоль:

Petrov 2.7
Sidorov 3.15
Petrov 5
Varez 3.1
Kirk 9

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

Вывод в консоль после buf = buf.replace('\n', ' '):

 Kirk 9

В чем нарушена логика выполнения и как ее можно исправить, чтобы текст выводился в виде

Petrov 2.7 Sidorov 3.15 Petrov 5 Varez 3.1 Kirk 9

Использовать по условию могу только FileReader.

Answer 1

Проблема в том, что в файле у вас не просто \n, а \r\n. Поэтому при замене только \n все \r остаются на месте, что приводит к выводу символов после \r с начала строки с затиранием уже выведенных символов.

То есть в buf по-прежнему хранятся все строки (в этом можно убедиться с помощью System.out.println(buf.length())), однако выводится buf некорректно (относительно того как нужно вам).

В данном случае достаточно сделать так:

buf = buf.replace("\r\n", " ");

А ещё я бы переписал код с закрытием Reader-а после чтения, обработкой исключений в самом коде, блочным чтением данных и использованием StringBuilder вместо конкатенации строк:

public static void main(String[] args)
{
    String fileName = args[0];
    try (FileReader reader = new FileReader(fileName))
    {
        char[] buffer = new char[1024];
        StringBuilder sb = new StringBuilder();
        int readCount;
        while ((readCount = reader.read(buffer)) != -1)
        {
            sb.append(buffer, 0, readCount);
        }
        String result = sb.toString().replace("\r\n", " ");
        System.out.println(result);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}
READ ALSO
FlipClock с перезагрузкой страницы браузера

FlipClock с перезагрузкой страницы браузера

Вопрос: Как сделать чтобы отсчет был с определенного момента и при перезагрузки страницы браузера не сбрасывался, а продолжал отсчет?

320
пропадает форма поиска

пропадает форма поиска

Добрый деньвот код файла index

224
Сделать кнопку неактивной js

Сделать кнопку неактивной js

Как сделать кнопку неактивной, если выбран 0 элемент списка, и активной, если другие элементы выбраны?

443