0

Я пытаюсь написать метод, который читается в файле с указанием пути и имени файла. Я назвал этот метод еще раз в своей программе, и все получилось нормально. Однако, по моему второму звонку, это дает мне ошибку, которая читает NoSuchElementException: No line found. Я просмотрел много других потоков и обнаружил, что проблема заключается в том, что закрытие сканера также закрывает System.in. Однако я не закрываю никаких сканеров или потоков ввода-вывода. Метод выглядит следующим образом:NoSuchElementException: строка не найдена - сканер Java

public static Map readFileMap(String path, String fileName) 
    throws IOException 
    { 
    path = path.replace("/", "\\"); 
    String key = null; 
    String val = null; 
    Map<String, String> map = new HashMap<String,String>(); 
    input = new Scanner(new File(path + fileName)); 
    int numLines = Helper.numLines(path + fileName); 
    System.out.println(numLines); 
    for (int loop = 0; loop < numLines; loop++) 
    //while(input.hasNextLine()) 
    { 
     String all = input.nextLine(); 
     System.out.println(all); 
     String[] pieces = all.split("\\s", 2); 
     key = pieces[0]; 
     val = pieces[1]; 
     map.put(key, val); 
    } 
    return map; 
    } 

переменная numLines содержит (правильное) значение 143. В случае, если это что-то делать с данными файла, данные выглядит следующим образом:

! %21 
" %22 
# %23 
$ %24 
% %25 
& %26 
' %27 
(%28 
) %29 
* %2A 
+ %2B 
, %2C 
- %2D 
. %2E 
/%2F 
[ %5B 
\ %5C 
] %5D 
^ %5E 
_ %5F 
` %60 
~ %7E 
    %7F 
` %80 
‚ %82 
ƒ %83 
„ %84 
… %85 
† %86 
‡ %87 
ˆ %88 
‰ %89 
Š %8A 
‹ %8B 
Π%8C 
Ž %8E 
‘ %91 
’ %92 
“ %93 
” %94 
• %95 
– %96 
— %97 
˜ %98 
™ %99 
š %9A 
› %9B 
œ %9C 
ž %9E 
Ÿ %9F 
¡ %A1 
¢ %A2 
£ %A3 
¤ %A4 
¥ %A5 
¦ %A6 
§ %A7 
¨ %A8 
© %A9 
ª %AA 
« %AB 
¬ %AC 
® %AE 
¯ %AF 
° %B0 
± %B1 
² %B2 
³ %B3 
´ %B4 
µ %B5 
¶ %B6 
· %B7 
¸ %B8 
¹ %B9 
º %BA 
» %BB 
¼ %BC 
½ %BD 
¾ %BE 
¿ %BF 
À %C0 
Á %C1 
 %C2 
à %C3 
Ä %C4 
Å %C5 
Æ %C6 
Ç %C7 
È %C8 
É %C9 
Ê %CA 
Ë %CB 
Ì %CC 
Í %CD 
Î %CE 
Ï %CF 
Ð %D0 
Ñ %D1 
Ò %D2 
Ó %D3 
Ô %D4 
Õ %D5 
Ö %D6 
× %D7 
Ø %D8 
Ù %D9 
Ú %DA 
Û %DB 
Ü %DC 
Ý %DD 
Þ %DE 
ß %DF 
à %E0 
á %E1 
â %E2 
ã %E3 
ä %E4 
å %E5 
æ %E6 
ç %E7 
è %E8 
é %E9 
ê %EA 
ë %EB 
ì %EC 
í %ED 
î %EE 
ï %EF 
ð %F0 
ñ %F1 
ò %F2 
ó %F3 
ô %F4 
õ %F5 
ö %F6 
÷ %F7 
ø %F8 
ù %F9 
ú %FA 
û %FB 
ü %FC 
ý %FD 
þ %FE 
ÿ %FF 

Как я уже упоминал ранее, когда я впервые позвонил методу, все прошло правильно. Поэтому я предполагаю, что это связано с тем, что я повторно инициализировал переменную input. Любая помощь будет принята с благодарностью!

+0

В чем проблема с input.hasNextLine()? Почему бы вам не использовать это? – Mac

+0

Данные, которые вы опубликовали, содержат 144 строки. –

+0

@Mac input.hasNextLine() не выполняется, потому что по какой-то причине он возвращает false, хотя numLines сообщает мне, что он не пуст. Когда я пытаюсь использовать input.hasNextLine(), Exception не печатает, поэтому я понятия не имею, что происходит. – Globmont

ответ

1

Из-за характера файла, который вы читаете, вы также должны указать кодировку символов на Scanner. Например, если файл был сохранен в UTF-8, вы должны использовать конструктор new Scanner(myFile, "UTF-8"). Попробовав свой код с этим изменением, я могу прочитать файл, который вы отправили без проблем (я сохранил этот файл в UTF-8, возможно, вы его сохраняете в какой-то другой кодировке). Кроме того, вызов input.hasNextLine() работает так, как ожидается после этого изменения.

редактировать: вы можете попробовать использовать что-то другое, чем Scanner, например, если у вас есть Java 7 вы можете просто сделать:

path = path.replace("/", "\\"); 
Map<String, String> map = new HashMap<String, String>(); 

for (String line : Files.readAllLines(Paths.get(path + fileName), Charset.defaultCharset())) { 
    String[] pieces = line.split("\\s", 2); 
    map.put(pieces[0], pieces[1]); 
} 

return map; 

Это должно бросить исключение, если найти нечитаемый набор символов. Если у вас нет Java 7, вы можете попробовать что-то вроде ниже. Я обнаружил, что этот метод не выдает никаких исключений, если он имеет неправильную кодировку, но просто распечатывает много «?» для символов, которые он не мог прочитать.

path = path.replace("/", "\\"); 
Map<String, String> map = new HashMap<String, String>(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(
    new FileInputStream(path + fileName))); 

while (true) { 
    String line = reader.readLine(); 
    if (line == null) { 
    break; 
    } 
    String[] pieces = line.split("\\s", 2); 
    map.put(pieces[0], pieces[1]); 
} 

reader.close(); 
return map; 

это

+0

Я попытался добавить это в Сканер, и я получаю ту же ошибку. Я думаю, что это имеет какое-то отношение к повторной инициализации, потому что первый вызов функции работает так, как ожидалось; но я не уверен. – Globmont

+0

Является первым вызовом функции, просматривающей тот же самый файл? – SamYonnou

+0

Нет, он читает другой файл, но он находится в том же макете и закодирован в той же кодировке. – Globmont

Смежные вопросы