обработка Java-файлов и исключения - PullRequest
4 голосов
/ 26 февраля 2011

Стандартный способ обработки чтения и записи файлов в java выглядит примерно так:

try
{
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.dat"));
    oos.writeObject(h);
    oos.close();
}
catch (FileNotFoundException ex)
{
}
catch (IOException ex)
{
}

Но меня беспокоит этот код, потому что здесь возможно, что файл никогда не закроется, если возникнет исключение. Конечно, мы можем добавить предложение finally и инициализировать ObjectOutputStream вне блока try. Однако, когда вы делаете это, вам нужно добавить еще один блок try / catch ВНУТРИ блока finally ... это просто ужасно. Есть ли лучший способ решения этой проблемы?

Ответы [ 5 ]

8 голосов
/ 26 февраля 2011

использовать Apache Commons IO

http://commons.apache.org/proper/commons-io/

посмотрите на их класс FileUtils. Полный золота. Золото говорю ....

6 голосов
/ 26 февраля 2011

Это совсем не стандартный способ. Это плохой путь.

То, как я использую большую часть времени, таково:

ObjectOutputStream out = null;
try {
    out = new ObjectOutputStream(new FileOutputStream("file.dat"));
    // use out
}
finally {
    if (out != null) {
        try {
            out.close();
        }
        catch (IOException e) {
            // nothing to do here except log the exception
        }
    }
}

Код в блоке finally можно поместить во вспомогательный метод, или вы можете использовать общий ввод / вывод для тихого закрытия потока, как отмечено в других ответах.

Поток всегда должен быть закрыт в блоке finally.

Обратите внимание, что JDK7 значительно упростит новый синтаксис, который автоматически закроет поток в конце блока try:

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file.dat"))) {
    // use out
}
3 голосов
/ 26 февраля 2011

Вот почему я использую commons-io's IOUtils.closeQutely (...)

try
{
...
}
finally 
{
   IOUtils.closeQuietly(costream);
}
0 голосов
/ 26 февраля 2011

добавьте это наконец:

finally{
   if(oos != null)
      oos.close();
}
0 голосов
/ 26 февраля 2011
try
{
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.dat"));
    oos.writeObject(h);
    //oos.close(); // glow coder removed
}
catch (FileNotFoundException ex)
{
}
catch (IOException ex)
{
}
// glowcoder adds:
finally {
    try {
        oos.close();
    }
    catch(IOException ex) {
        // dammit we tried!
    }
}
...