Сканер обрезает мою строку после примерно 2400 символов - PullRequest
6 голосов
/ 23 мая 2010

У меня есть очень простой код, такой как

while (scan.hasNextLine())
{
    String temp = scan.nextLine();
    System.out.println(temp);
}

где сканирование - это сканер над файлом.

Тем не менее, в одной конкретной строке, длиной около 6 тыс. Символов, временная температура сокращается примерно до 2470 символов. В этом нет ничего особенного, когда оно отключается; это в середине слова "Австралия". Если я удаляю символы из строки, место, где они вырезаны, меняется; например если я удалю символы 0-100 в файле, то Сканер получит то, что было раньше 100-2570.

Я использовал Scanner для больших строк раньше. Есть идеи, что может пойти не так?

1 Ответ

8 голосов
/ 23 мая 2010

В предположении, у вас может быть мошеннический символ в точке отсечения: посмотрите на файл в шестнадцатеричном редакторе, а не просто в текстовом редакторе. Возможно, есть встроенный нулевой символ или, возможно, \r в середине строки? Мне кажется маловероятным, что Scanner.nextLine() просто порубит его произвольно.

Как еще одна мысль, вы на 100% уверены, что это не все там? Возможно, System.out.println прерывает строку - опять же из-за какого-то «странного» символа, встроенного в нее? Что произойдет, если вы напечатаете temp.length()?

РЕДАКТИРОВАТЬ: Я немного неправильно понял, что произойдет, если вы отключите некоторые символы. Извини за это. Несколько других вещей, чтобы проверить:

  • Если вы читаете строки с BufferedReader.readLine() вместо Scanner, все ли получается?
  • Вы указываете правильную кодировку? Я не понимаю, почему это проявляется именно таким образом, но есть над чем подумать ...
  • Если вы замените все символы в строке на «A» (в файле), это что-нибудь изменит?
  • Если вы добавите дополнительную строку перед этой строкой (или удалите строку перед ней), это что-нибудь изменит?

Если все это не сработать, я просто отлаживаю в Scanner.nextLine() - одна из приятных особенностей Java - то, что вы можете отлаживать в стандартных библиотеках.

...