Подтвердить что ты не робот

Сканер Java не просматривает весь файл

Я пишу программу на Java, и одна из вещей, которую мне нужно сделать, - создать набор всех допустимых мест для кратчайшего пути. Места определяются в файле .txt, который следует строгому шаблону (одна запись в строке, без лишних пробелов) и идеально подходит для использования .nextLine для получения данных. Моя проблема заключается в том, что 241 строка в файл (из 432) сканер перестает работать 3/4 пути через запись и не распознает новые строки.

Мой код:

    //initialize state space
private static Set<String> posible(String posLoc) throws FileNotFoundException {
    Scanner s = new Scanner(new File(posLoc));
    Set<String> result = new TreeSet<String>();
    String availalbe;
    while(s.hasNextLine()) {
        availalbe = s.nextLine();
        result.add(availalbe);
    }
    s.close();
    return result;
}

Данные

Shenlong Gundam
Altron Gundam
Tallgee[scanner stops reading here]se
Tallgeese II
Leo (Ground)
Leo (Space)

Конечно, "сканер перестает читать здесь" не находится в данных, я просто отмечаю, где сканер перестает читать файл. Это 3068 байт в файл, но это ничего не должно влиять, потому что в той же программе, с почти идентичным кодом, я читаю 261-строчный, 14 КБ. TXT файл, который кодирует пути. Любая помощь будет оценена.

Спасибо.

4b9b3361

Ответ 1

Проблема с сканером, читающим ваш файл, но я не уверен, что это такое. Он ошибочно полагает, что он дошел до конца файла, когда он этого не сделал, возможно, из-за некоторой фанковой кодировки String. Попробуйте использовать объект BufferedReader, который вместо этого обертывает объект FileReader.

например,

   private static Set<String> posible2(String posLoc) {
      Set<String> result = new TreeSet<String>();
      BufferedReader br = null;
      try {
         br = new BufferedReader(new FileReader(new File(posLoc)));
         String availalbe;
         while((availalbe = br.readLine()) != null) {
             result.add(availalbe);            
         }
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         if (br != null) {
            try {
               br.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }
      return result;
  }

Edit
Я попытался уменьшить вашу проблему до минимума, и этого было достаточно, чтобы вызвать проблему:

   public static void main(String[] args) {
      try {
         Scanner scanner = new Scanner(new File(FILE_POS));
         int count = 0;
         while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            System.out.printf("%3d: %s %n", count, line );
            count++;
         }

Я проверил объект Scanner с помощью printf:

System.out.printf("Str: %-35s size%5d; Has next line? %b%n", availalbe, result.size(), s.hasNextLine());

и показал, что он думал, что файл закончился. Я был в процессе постепенного удаления строк из данных в файл, чтобы увидеть, какая строка вызвала проблему, но оставит это вам.

Ответ 2

Я столкнулся с той же проблемой, и это я сделал, чтобы исправить это:

1.Saved the file I was reading from into UTF-8
2.Created new Scanner like below, specifying the encoding type:


   Scanner scanner = new Scanner(new File("C:/IDSBRIEF/GuidData/"+sFileName),"UTF-8");   

Ответ 3

У меня была такая же проблема. Сканер не читал до конца файла, фактически останавливаясь прямо посреди слова. Я думал, что это проблема с некоторыми ограничениями, установленными на сканере, но я принял к сведению комментарий от rfeak о кодировке символов.

Я повторно сохранил .txt, который я читал в UTF-8, он решил проблему. Оказывается, что "Блокнот" по умолчанию отказался от ANSI.

Ответ 4

У меня был txt файл, в котором Сканер прекратил чтение по строке 862, это была странная проблема. То, что я сделал, это создать другой файл (чтобы попытаться воспроизвести проблему). Я добавил его меньше, чем 862 строки, затем я добавил более 862, и он работал нормально.

Итак, я считаю, что проблема в том, что в моем предыдущем файле на строке 862 было что-то не так, как какой-то символ или символ, которые могли бы ввести Scanner в заблуждение, чтобы закончить чтение раньше.

В заключение: на основе этого опыта я рекомендую узнать точную строку, в которой сканер перестает читать, чтобы найти решение для каких-либо проблем.

Ответ 5

Мое дело:

  • в моей основной программе (A) он всегда читает 16384 байта из файла 41021 байта. Символ, где он останавливается, находится в середине строки с обычным печатаемым текстом
  • если я создаю небольшую отдельную программу (B) только со сканером и печатными строками, она читает весь файл
  • указание "UTF-8" в (A) все еще читает 16384
  • указание "ASCII" в (A) все еще читает 16384
  • указав "Cp1252" в (A) считывает весь файл
  • мои входные текстовые файлы отправляются пользователями, и я не могу быть уверен, что они напишут их в какой-либо конкретной кодировке

Выводы

  • Сканер, кажется, читает файл блок за блоком и записывает правильно прочитанные данные в возвращаемую строку, но когда он находит блок с кодировкой, отличной от ожидаемой, он выходит молча (ой) и возвращает частичную строку
  • txt файл, который я пытаюсь прочитать, - Cp1252, мой (A) исходный файл - UTF-8, а мой (B) - исходный файл Cp1252, так что почему (B) работало без указания кодировки

Решение

  • забудьте о сканере и пользуйтесь

String fullFileContents = new String(Files.readAllBytes(myFile.toPath()));

Конечно, символы, не относящиеся к ascii, не могут быть надежно прочитаны, так как вы не знаете кодировку, но символы ascii будут прочитаны наверняка. Используйте его, если вам нужны только символы ascii в файле, а часть, не относящуюся к ascii, может быть отброшена.

Ответ 6

У меня также была похожая проблема на моем сервере Linux, и, наконец, приведенный ниже код работал для меня.

Сканер сканер = новый сканер (новый файл (имя файла), "UTF-8");

Ответ 7

У меня была такая же проблема с CSV файлом: он работал в Windows, но не работал в Linux

Откройте файл с помощью nodepad++ и измените кодировку, выберите: Кодировать в UTF8 (с помощью спецификации). Это решило проблему в моем случае

Ответ 8

Вы должны использовать это:

Сканер сканер = новый сканер (fileObj).useDelimiter( "\ z" )

System.out.println(scanner.next());