Код программы считывает информацию из файла и переводит его в строку:
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
.
Проблема в том, что в файле у вас не просто \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();
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Вопрос: Как сделать чтобы отсчет был с определенного момента и при перезагрузки страницы браузера не сбрасывался, а продолжал отсчет?
Как сделать кнопку неактивной, если выбран 0 элемент списка, и активной, если другие элементы выбраны?