Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/64: Рейтинг темы: голосов - 64, средняя оценка - 4.55
1 / 2 / 0
Регистрация: 20.02.2017
Сообщений: 95

Чтение файла в кодировке UTF-8 InputStreamReader

15.01.2019, 15:08. Показов 12652. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день.

Мне необходимо прочитать текстовый файл в кодировке UTF-8 построчно.
Написал программу, которая должна вывести на экран две первые строчки.

Сам тестовый файл набран в FAR в кодировке UTF-8 и представляет из себя две строчки:
Иванов Иван Иванович
Петров Петр Петрович

Ниже текст программы:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.*;
public class FRP {
 
    // построчное считывание файла
    public static void main(String[] args) {
        try {
            File file = new File("//192.168.0.200/user/1.txt");
 
            //создаем объект InputStreamReader для объекта File
            InputStreamReader fr = new InputStreamReader(new FileInputStream(file), "UTF-8");
            //создаем BufferedReader с существующего InputStreamReader для построчного считывания
            BufferedReader reader = new BufferedReader(fr);
 
            // считаем сначала первую строку
            final String NAME1 = reader.readLine();
            // печатаем первую строку
            System.out.println(NAME1);
            // считаем вторую строку
            final String NAME2 = reader.readLine();
            // считаем сначала первую строку
            System.out.println(NAME2);
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
После выполнения получаем:


Вопросы:
1. Почему считалась только первая строчка "Иванов Иван Иванович"?
2. Почему перед "Иванов..." появилась какая-то точка?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2019, 15:08
Ответы с готовыми решениями:

Чтение файла в кодировке utf-8 и вывод в консоль
Здорова! Пытаюсь прочитать файл в кодировке utf-8 (вот он ) и вывожу его в консоль, ничего не получается. Вот код: #include...

Чтение .txt файла, сохраненного в кодировке UTF-8
Привет всем! Есть .txt файл, в котором записаны 4 символа: ӮӰӴӸԊ. Файл сохранен в кодировке UTF-8. При чтении из этого файла, получается...

Чтение файлов формата .txt в кодировке utf-8
Уважаемые форумчане! Делаю скрипт для чтения и записи txt-файлов из Excel-вского файла по средствам VBA макросов. Но всё упёрлось в...

6
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
15.01.2019, 16:02
vskh, файл раз такой маленький то мог бы и приложить в доказательство
0
1 / 2 / 0
Регистрация: 20.02.2017
Сообщений: 95
15.01.2019, 17:04  [ТС]
1.txt
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
15.01.2019, 17:32
Лучший ответ Сообщение было отмечено vskh как решение

Решение

vskh, открой его в notepad++ и увидишь, что вторая строка пуста, файл выглядит вот так
Иванов Иван Иванович

Петров
Петр Петрович
точки у меня никакой нет, ты файл локально считываешь из файловой системы или по сети?
Цитата Сообщение от vskh Посмотреть сообщение
File file = new File("//192.168.0.200/user/1.txt");
0
1 / 2 / 0
Регистрация: 20.02.2017
Сообщений: 95
15.01.2019, 17:38  [ТС]
По сети.

Если считывать не так, а в цикле
Java
1
2
3
4
5
6
7
8
// считаем сначала первую строку
            final String NAME1 = reader.readLine();
            // печатаем первую строку
            System.out.println(NAME1);
            // считаем вторую строку
            final String NAME2 = reader.readLine();
            // считаем сначала первую строку
            System.out.println(NAME2);
цикл:
Java
1
2
3
4
5
6
String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                // считываем остальные строки в цикле
                line = reader.readLine();
            }
То файл печатается таким образом:


Точка исчезает, а имя и отчество второго человека печатается на другой строчке...
0
1 / 2 / 0
Регистрация: 20.02.2017
Сообщений: 95
15.01.2019, 18:04  [ТС]
Увидел, что в другом текстовом редакторе слова расположены по другому. Странно, лично набирал в FAR этот текст.

Добавлено через 22 минуты
Создал файл в Notepad++. Все заработало. Не знал, что FAR криво создает текстовые файлы. Спасибо.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
16.01.2019, 11:15
Лучший ответ Сообщение было отмечено iSmokeJC как решение

Решение

vskh,

Если вывести содержимое твоего файла в виде байтов, а символы перехода на новую строку '\n' и возврат каретки '\r' — в их char представлении:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public static void main(String[] args) throws Exception {
        final Path file = Paths.get(System.getProperty("user.home")).resolve("Downloads").resolve("1.txt");
        final byte[] bytes = Files.readAllBytes(file);
        for (byte b : bytes) {
            if (b == '\n') {
                System.out.print("\\n ");
            } else if (b == '\r') {
                System.out.print("\\r ");
            } else {
                System.out.printf("%02X ", b);
            }
        }
        System.out.println();
        for (byte b : bytes) {
            System.out.printf("%s ", toBitString(b));
        }
        System.out.println();
    }
 
    private static String toBitString(byte b) {
        return String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0');
    }


Code
1
2
3
4
5
6
Иванов Иван Иванович
 
Петров
 Петр Петрович
EF BB BF D0 98 D0 B2 D0 B0 D0 BD D0 BE D0 B2 20 D0 98 D0 B2 D0 B0 D0 BD 20 D0 98 D0 B2 D0 B0 D0 BD D0 BE D0 B2 D0 B8 D1 87 \r \n \r D0 9F D0 B5 D1 82 D1 80 D0 BE D0 B2 \r 20 D0 9F D0 B5 D1 82 D1 80 20 D0 9F D0 B5 D1 82 D1 80 D0 BE D0 B2 D0 B8 D1 87 
...
то становится видно, что

Цитата Сообщение от vskh Посмотреть сообщение
1. Почему считалась только первая строчка "Иванов Иван Иванович"?
Про пустую вторую строку тебе написали. Причина — последовательность символов \r\n\r после Иванова И. И. Reader интерпретирует эту последовательность как два перехода на новую строку: \r\n (Windows формат) и \r (Classic MacOS формат). Отсюда и пустая строка после Иванова И. И.
Далее, после "Петров" идёт одиночный символ '\r' (как он туда попал — ХЗ, возможно, глюк FAR'а), который снова интерпретируется как переход на новую строку.

В Linux и прочих Unix-like, в т.ч. и в современной macOS, символом перехода на новую строку является '\n', поэтому отдельный '\r' приводит к такому эффекту, например, в терминале:
Bash
1
2
3
~/Downloads $ cat 1.txt 
Иванов Иван Иванович
 Петр Петрович
— пустая строка и строка "Петров" просто затёрлись.

Цитата Сообщение от vskh Посмотреть сообщение
2. Почему перед "Иванов..." появилась какая-то точка?
это Byte order markEF BB BF. В UTF-8 он не нужен, но некоторые редакторы (например, стандартный Windows Notepad и видимо, FAR) его вставляют.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2019, 11:15
Помогаю со студенческими работами здесь

Создание файла в UTF-8 кодировке
Здравствуйте! Как сделать что бы в данной ситуации файл создавался в utf-8 DWORD tmp0; TCHAR buffer; bool test; ...

Чтение файла в неверной кодировке
Работая с текстовым файлом столкнулся с ошибкой чтения. Используя свой любимый метод: Dim zap As New...

чтение файла в заданой кодировке
Здравствуйте. У меня такая проблема: нужно прочитать файл в кодировке Windows 1251, а так как я пытаюсь сделать это с помощью методов...

Чтение файла в нужной кодировке
Здравсвуйте, помогите разобраться, нужно при загрузке файла прочитать строки и записать их в БД, кодировка файла изначально не известна,...

Чтение из файла в нужной кодировке
Си не видит русские буквы в текстовом файле. Вот сама задача "Дан файл, содержащий текст, включающий русские и английские слова....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru