Первый символ чтения из текстового файла: 

Если я напишу этот код, я получу это в качестве вывода --> Сначала это: , а затем другие строки

try {
    BufferedReader br = new BufferedReader(new FileReader(
            "myFile.txt"));

    String line;
    while (line = br.readLine() != null) {
        System.out.println(line);
    }
    br.close();

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

Как я могу этого избежать?


person Milton90    schedule 01.07.2013    source источник
comment
Я думаю, это из-за кодировки.   -  person Ionică Bizău    schedule 01.07.2013
comment
Может БОМ? en.wikipedia.org/wiki/Byte_order_mark   -  person Maxime Chéramy    schedule 01.07.2013
comment
Это спецификация UTF-8.   -  person Raphaël    schedule 01.07.2013
comment
Я решил так: BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(dictionary.txt),UTF8)); если (line.startsWith()) { line = line.substring(1); }   -  person Milton90    schedule 01.07.2013
comment
Однако это удалит  с начала каждой строки. Я думаю, вы хотите удалить только то, что находится в начале файла.   -  person Nayuki    schedule 01.07.2013
comment
Да, я делаю это только для чтения первой строки.   -  person Milton90    schedule 01.07.2013
comment
@Milton90 Milton90: это хорошее решение, оно помогло мне, спасибо.   -  person Ankur Srivastava    schedule 11.05.2017


Ответы (2)


Вы получаете символы  в первой строке, потому что эта последовательность является меткой порядка байтов UTF-8 (BOM) . Если текстовый файл начинается с спецификации, скорее всего, он был создан программой Windows, такой как Блокнот.

Чтобы решить вашу проблему, мы решили читать файл явно как UTF-8 вместо любой кодировки системных символов по умолчанию (US-ASCII и т. д.):

BufferedReader in = new BufferedReader(
    new InputStreamReader(
        new FileInputStream("myFile.txt"),
        "UTF-8"));

Затем в UTF-8 последовательность байтов  декодируется в один символ, то есть U+FEFF. Этот символ является необязательным — допустимый файл UTF-8 может начинаться с него, а может и не начинаться. Поэтому мы пропустим первый символ, только если это U+FEFF:

in.mark(1);
if (in.read() != 0xFEFF)
  in.reset();

И теперь вы можете продолжить работу с остальным кодом.

person Nayuki    schedule 01.07.2013
comment
Если я прав, символ спецификации будет встречаться только один раз во всем файле? - person Adil; 19.04.2018
comment
Это может произойти несколько раз, если тупая программа объединила несколько файлов, каждый из которых содержал заголовок BOM. - person Nayuki; 19.04.2018

Проблема может быть в используемой кодировке. попробуй это:

BufferedReader in = new BufferedReader(new InputStreamReader(
      new FileInputStream("yourfile"), "UTF-8"));
person Tala    schedule 01.07.2013
comment
Я бы сказал, что это определенно кодировка ;) - person Joey; 01.07.2013
comment
Я уже пробовал. Вместо  становится '?' - person Milton90; 01.07.2013
comment
Это может быть из-за используемой вами IDE. Иногда они устанавливают кодировку по умолчанию родной операционной системы - person Tala; 01.07.2013