Java-сканер не просматривает весь файл - PullRequest
17 голосов
/ 30 ноября 2011

Я пишу программу на 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, который кодирует пути.Любая помощь будет принята.

Спасибо.

Ответы [ 8 ]

17 голосов
/ 30 ноября 2011

Есть проблема со сканером, читающим ваш файл, но я не уверен, что это такое.Он ошибочно полагает, что он достиг конца файла, когда этого не произошло, возможно, из-за какой-то классной строковой кодировки.Попробуйте использовать объект 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;
  }

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

   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());

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

7 голосов
/ 23 апреля 2013

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

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");   
5 голосов
/ 21 июня 2012

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

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

0 голосов
/ 06 февраля 2019

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

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

0 голосов
/ 23 декабря 2018

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

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

0 голосов
/ 24 октября 2018

Мой случай:

  • в моей основной программе (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, может быть отброшена.

0 голосов
/ 07 июня 2014

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

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

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

0 голосов
/ 03 августа 2012

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

Scanner scanner = новый сканер (fileObj) .useDelimiter ("\ z");
System.out.println (scanner.next ());

...