美文网首页
FileOutputStream是否需要flush和close?

FileOutputStream是否需要flush和close?

作者: RedB | 来源:发表于2022-06-05 21:49 被阅读0次

    最近在用kotlin编写从assets复制文件到CacheDir的代码,想在StackOverflow上找一下最佳实践,发现有的人在调用input.copyTo(output, 1024)之后会调用output.flush()而有的人不会,于是研究了一下这个问题:FileOutputStream是否需要flush和close?
    答案:需要close()但不需要flush()。因为在FileOutputStream中,override了close方法进行了一些操作比如关闭channel等等,没有overrideflush方法;而在它的父类OutputStream的代码中,closeflush的实现均为空。

    OutputStream.java

      /**
        * Flushes this output stream and forces any buffered output bytes
        * to be written out. The general contract of <code>flush</code> is
        * that calling it is an indication that, if any bytes previously
        * written have been buffered by the implementation of the output
        * stream, such bytes should immediately be written to their
        * intended destination.
    
        * If the intended destination of this stream is an abstraction provided by
        * the underlying operating system, for example a file, then flushing the
        * stream guarantees only that bytes previously written to the stream are
        * passed to the operating system for writing; it does not guarantee that
        * they are actually written to a physical device such as a disk drive.
    
        * The <code>flush</code> method of <code>OutputStream</code> does nothing.
        *
        * @exception  IOException  if an I/O error occurs.
        */
        public void flush() throws IOException {
        }
    
       /**
        * Closes this output stream and releases any system resources
        * associated with this stream. The general contract of <code>close</code>
        * is that it closes the output stream. A closed stream cannot perform
        * output operations and cannot be reopened.
    
        * The <code>close</code> method of <code>OutputStream</code> does nothing.     
    
        * @exception  IOException  if an I/O error occurs.
        */
        public void close() throws IOException {
        }
    

    FileOutputStream.java

    public void close() throws IOException {
        synchronized (closeLock) {
            if (closed) {
                return;
            }
            closed = true;
        }
    
        // Android-added: CloseGuard support.
        guard.close();
        if (channel != null) {
            channel.close();
        }
    
        // BEGIN Android-changed: Close handling / notification of blocked threads.
        if (isFdOwner) {
            IoBridge.closeAndSignalBlockedThreads(fd);
        }
        // END Android-changed: Close handling / notification of blocked threads.
    }
    

    相关文章

      网友评论

          本文标题:FileOutputStream是否需要flush和close?

          本文链接:https://www.haomeiwen.com/subject/fbcdmrtx.html