2015-03-04 4 views
2

Таким образом, я использую сканер для чтения файла. Однако я не понимаю, что если файл является файлом UTF-8, а текущая строка, читаемая при итерации по файлу, содержит цифру, метод Character.isDigit(line.charAt(0)) возвращает false. Однако, если файл не является файлом UTF-8, метод возвращает true.Символьная цифра не соответствует истине при чтении из файла UTF-8

Heres некоторый код

File theFile = new File(pathToFile); 
Scanner fileContent = new Scanner(new FileInputStream(theFile), "UTF-8"); 
while(fileContent.hasNextLine()) 
{ 
    String line = fileContent.nextLine(); 
    if(Character.isDigit(line.charAt(0))) 
    { 
     //When the file being read from is NOT a UTF-8 file, we get down here 
    } 

При использовании отладчика и глядя на line строки, я могу видеть, что в обоих случаях (UTF-8 файл или нет) строка, как провести такой же, цифра , Почему это происходит?

+0

Вы отлаживали ее? Какой символ возвращает 'line.charAt (0)', когда он не делает то, что вы ожидаете? – Jesper

+0

'line.charAt (0)' ничего не возвращает при использовании файла UTF-8, что объясняет, почему Character.isDigit не возвращает true ofcourse. Но почему 'line.charAt (0)' ничего не возвращает? –

+0

Этого не происходит. То есть, «Строка», которую вы получаете от чтения одного файла, отличается от того, который вы получаете от чтения другого. После того, как вы получите строку в форме «String», Java не знает и не заботится о том, откуда появилась «char». Когда вы отлаживаете, посмотрите на целочисленные значения 'char's, а не на их графическое представление и, конечно же, не на графическое представление всей строки. –

ответ

2

Как, наконец, обмениваясь комментариями, ваш файл содержит спецификацию. Обычно это не рекомендуется для файлов UTF-8, потому что Java не ожидает этого и видит в нем данные.

Таким образом, есть два варианта у вас есть:

  1. , если вы находитесь в контроле файла, его воспроизвести без BOM

  2. Если нет, то проверьте файл для BOM существования и удалить прежде чем перейти к другим операциям.

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

private static InputStream filterBOMifExists(InputStream inputStream) throws IOException { 
     PushbackInputStream pushbackInputStream = new PushbackInputStream(new BufferedInputStream(inputStream), 3); 
     byte[] bom = new byte[3]; 
     if (pushbackInputStream.read(bom) != -1) { 
      if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) { 
       pushbackInputStream.unread(bom); 
      } 
     } 
     return pushbackInputStream; 
    }