Как мне проверить, закрыт ли уже BufferedWriter?

В android я пишу файл при нажатии кнопки, и при следующем нажатии он сохраняет файл и закрывает буферизованный писатель. Но я также хочу реализовать функциональность, чтобы закрыть буферизованный писатель в функции onDestroy. Перед этим мне нужно знать, закрыто ли уже Bufferedwriter. Как я могу проверить, что Buffered Writer уже закрыт?

В дополнение к этому, функция bufferedWriter.close() устанавливает bufferedWriter в null?


person Astra Uvarova - Saturn's star    schedule 30.03.2016    source источник
comment
if (writer ! = null) затем закройте его.   -  person SatyaTNV    schedule 30.03.2016
comment
устанавливает ли функция bufferedWriter.close () bufferedWriter значение null Нет, это невозможно. bufferedWriter - это просто ссылка на BufferedWriter экземпляр; этот экземпляр может иметь ноль или более ссылок на него, и у него нет способа узнать, что на самом деле ссылается на него.   -  person Andy Turner    schedule 30.03.2016


Ответы (4)


Вызов метода close на уже закрытом Writer не влияет.

Тем не менее, если вы хотите узнать, закрыт ли Writer, вы можете вызвать writer.flush(), если он выдает IOException, это означает, что Writer уже закрыт.

Что касается вашего второго вопроса, закрытие потока не аннулирует ссылку. Вы должны явно указать null.

person sidgate    schedule 30.03.2016
comment
Спасибо за объяснение. - person Astra Uvarova - Saturn's star; 30.03.2016

вы можете проверить, не равно ли bufferredWriter нулю

if(bufferredWriter!=null)
{
bufferredWriter.close();
}

Если вы используете java7 или более позднюю версию, вам не нужно беспокоиться о закрытии BufferredWriter

Начиная с JDK 7, вы можете попробовать с помощью ресурса

Например

try(BufferredWriter bufferedWriter=new BufferredWriter())
{

//your code
}
catch(Exception e)
{
}
person SpringLearner    schedule 30.03.2016

    BufferedWriter vf = new BufferedWriter(new FileWriter("file"));

    if (vf != null)
    {
        vf.close();
        vf.close(); //won't cause any problem
    }

вы можете закрывать BufferedWriter сколько угодно раз, если оно не равно нулю. Так что не нужно специально проверять, открыт BufferedWriter или нет.

Еще лучше, если вы окружите оператор close в try / catch в случае возникновения исключения IOException.

Из javadocs

Закрывает ручей, сначала промывая его. После закрытия потока дальнейшие вызовы write () или flush () вызовут выброс исключения IOException. Закрытие ранее закрытого потока не имеет никакого эффекта.

И, как объяснил sidgate, закрытие потока не аннулирует ссылку, которую вы должны назначить вручную.

person codingenious    schedule 30.03.2016
comment
Вау, это в новинку для меня. Можете ли вы объяснить такое поведение? - person Astra Uvarova - Saturn's star; 30.03.2016
comment
из javadocs Closing a previously closed stream has no effect.. Я просто сослался на javadoc. :) - person codingenious; 30.03.2016

bufferedWriter.close () - закрывает этот писатель. Содержимое буфера сбрасывается, целевой писатель закрывается, и буфер освобождается. Только первый вызов close имеет какой-либо эффект.

См. это

Также вы можете проверить вот так

Определите ниже 2 переменных как переменную экземпляра

BufferedWriter bufferWriter;
boolean isOpen = false;

Потом,

try {
    if (!isOpen) {
        bufferWriter = new BufferedWriter(new FileWriter(file, true));
        bufferWriter.write(initialData);
        isOpen = true;
    }
    bufferWriter.write(remainingData);
    bufferWriter.flush();
    Log.d(TAG, "written to file:" + file.getAbsolutePath());
} catch (IOException e) {
    Log.v("IOException", e.toString());
}
person Raghu Nagaraju    schedule 30.03.2016