2014-01-14 3 views
0

Вот метод:Java HashMap записи в файл

private void writeToFile() { 
    try { 
     String time = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()); 
     String name = "dictionaryFile" + time + ".txt"; 
     File dictionaryFile = new File(name); 
     BufferedWriter writer = new BufferedWriter(new FileWriter(dictionaryFile)); 
     Iterator<String> it = dictionary.keySet().iterator(); 
     while (it.hasNext()){ 
      String line = it.next(); 
      String entryLine = line + " -> " + dictionary.get(line); 
      writer.write(entryLine); 
      writer.close(); 
     } 
    } catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 

А вот ошибка:

java.io.IOException: Stream closed 
at java.io.BufferedWriter.ensureOpen(Unknown Source) 
at java.io.BufferedWriter.write(Unknown Source) 
at java.io.Writer.write(Unknown Source) 
at WordQuizz.WordCollection.writeToFile(WordCollection.java:58) 
at WordQuizz.WordCollection.actionPerformed(WordCollection.java:44) 

Может кто-нибудь помочь мне решить эту проблему? если я просто попробую sysout print entryLine, то ошибки не будет. Может быть, мне нужно указать местоположение файла или что-то вроде этого?

ответ

3

Проблема в том, что у вас есть writer.close(); внутри цикла while. Как только он закрыт на первой итерации, ничего не может быть написано, и исключение, которое вы видели, выбрасывается.

Поместить вызов close после while петля. Если вы используете Java 7+, используйте "try-with-resources" syntax, чтобы закрыть его, когда заканчивается try.

2

Почему вы закрываете свой поток прямо в середине цикла while? Скорее:

while (it.hasNext()){ 
      String line = it.next(); 
      String entryLine = line + " -> " + dictionary.get(line); 
      writer.write(entryLine); 
} 

writer.close(); 
1

Не закрывайте запись в середине цикла while. Измените свой код, как показано ниже.

private void writeToFile() { 
    BufferedWriter writer; 
    try { 
     String time = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()); 
     String name = "dictionaryFile" + time + ".txt"; 
     File dictionaryFile = new File(name); 
     writer = new BufferedWriter(new FileWriter(dictionaryFile)); 
     Iterator<String> it = dictionary.keySet().iterator(); 
     while (it.hasNext()) { 
      String line = it.next(); 
      String entryLine = line + " -> " + dictionary.get(line); 
      writer.write(entryLine); 
      //writer.close(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (writer != null) { 
      writer.close(); 
     } 
    } 
} 

Всегда закрывайте операцию ввода-вывода в блоке finally и проверяйте, не экземпляр экземпляра.

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