2016-03-30 4 views
4

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

В дополнение к этому, bufferedWriter.close() функциональный набор bufferedWriter до null?

+1

'если (писатель! = NULL) 'затем закройте его. – Satya

+0

"делает bufferedWriter.close() функцией set bufferedWriter для null" Нет, это невозможно. 'bufferedWriter' - это просто ссылка на экземпляр BufferedWriter; этот экземпляр может иметь ноль или более ссылок на него, и он не имеет никакого способа узнать, что на самом деле относится к нему. –

ответ

4

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

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

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

+0

Спасибо за объяснение. – cybodroid

0

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

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

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

JDK 7 и далее вы можете сделать вас примерочных с ресурсом

, например

try(BufferredWriter bufferedWriter=new BufferredWriter()) 
{ 

//your code 
} 
catch(Exception e) 
{ 
} 
0
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, закрытие потока не приведет к аннулированию ссылки, которую вы должны назначить вручную.

+0

Вау, это ново для меня. Можете ли вы дать какое-либо объяснение этому поведению? – cybodroid

+0

из javadocs 'Закрытие ранее закрытого потока не влияет. '. Я просто назвал джавадока. :) – Batty

+1

О, спасибо. :-) Я думаю, что я должен чаще читать javadocs. – cybodroid

0

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

См this

Кроме того, вы можете проверить, как этот

Определить ниже 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()); 
} 
Смежные вопросы