Сканер 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 файл, который кодирует пути. Любая помощь будет оценена.
Спасибо.
Ответы
Ответ 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());