android BufferedOutputStreamの使用


今日は、androidのBufferedOutputStreamの使用について簡単に説明します.
BufferedInputStreamはバッファ付きの入力ストリームであり、デフォルトのバッファサイズは8 Mであり、ディスクへのアクセス回数を減らし、ファイルの読み取り性能を向上させることができる.BufferedOutputStreamはバッファ付き出力ストリームであり、ファイルの書き込み効率を向上させることができる.BufferedInputStreamとBufferedOutputStreamはそれぞれFilterInputStreamクラスとFilterOutputStreamクラスのサブクラスであり、装飾設計モードを実現している.
構築方法
//           ,              。
public BufferedOutputStream(OutputStream out);

//           ,                        。
public BufferedOutputStream(OutputStream out,int size);

よく使われる方法
//           
public void write(int b);

//    byte         off     len             。
public void write(byte[] b,int off,int len);

//         。                      。
public void flush();

サンプルコード:
public class BufferedOutputStreamTest {

    private static final int LEN = 5;
    //       “abcddefghijklmnopqrsttuvwxyz”
    private static final byte[] ArrayLetters = {
        0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
        0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
    };

    public static void main(String[] args) {
        testBufferedOutputStream() ;
    }

    /**
     * BufferedOutputStream API    
    */
    private static void testBufferedOutputStream() {

        //   “     ”   BufferedOutputStream
        //           16,       >=16 ,                。
        try {
            File file = new File("out.txt");
            OutputStream out =new BufferedOutputStream(new FileOutputStream(file), 16);
            //  ArrayLetters    10          
            out.write(ArrayLetters, 0, 20);
            //  “   
” out.write('
'); // TODO! out.flush(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

実行結果はファイルに20文字:abcdefghijklmnopqrst、こちらに設定されているバッファサイズは16なので、20文字入力時に16を超え、バッファを使用せず、直接データを書き込みます
JDK 8ベースのBufferedOutputStreamクラスのソースコード:
public class BufferedOutputStream extends FilterOutputStream {
    /**
     * The internal buffer where data is stored.
     */
    //    
    protected byte buf[];

    /**
     * The number of valid bytes in the buffer. This value is always
     * in the range 0 through buf.length; elements
     * buf[0] through buf[count-1] contain valid
     * byte data.
     */
    //          
    protected int count;

    /**
     * Creates a new buffered output stream to write data to the
     * specified underlying output stream.
     *
     * @param   out   the underlying output stream.
     */
    //    ,       8*1024
    public BufferedOutputStream(OutputStream out) {
        this(out, 8192);
    }

    /**
     * Creates a new buffered output stream to write data to the
     * specified underlying output stream with the specified buffer
     * size.
     *
     * @param   out    the underlying output stream.
     * @param   size   the buffer size.
     * @exception IllegalArgumentException if size <= 0.
     */
    public BufferedOutputStream(OutputStream out, int size) {
        super(out);
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }

    /** Flush the internal buffer */
    //        
    private void flushBuffer() throws IOException {
        if (count > 0) {
            out.write(buf, 0, count);
            count = 0;
        }
    }

    /**
     * Writes the specified byte to this buffered output stream.
     *
     * @param      b   the byte to be written.
     * @exception  IOException  if an I/O error occurs.
     */
    //     
    public synchronized void write(int b) throws IOException {
        if (count >= buf.length) {
            flushBuffer();
        }
        buf[count++] = (byte)b;
    }

    /**
     * Writes len bytes from the specified byte array
     * starting at offset off to this buffered output stream.
     *
     * 

Ordinarily this method stores bytes from the given array into this * stream's buffer, flushing the buffer to the underlying output stream as * needed. If the requested length is at least as large as this stream's * buffer, however, then this method will flush the buffer and write the * bytes directly to the underlying output stream. Thus redundant * BufferedOutputStreams will not copy data unnecessarily. * * @param b the data. * @param off the start offset in the data. * @param len the number of bytes to write. * @exception IOException if an I/O error occurs. */ // b off len public synchronized void write(byte b[], int off, int len) throws IOException { if (len >= buf.length) { /* If the request length exceeds the size of the output buffer, flush the output buffer and then write the data directly. In this way buffered streams will cascade harmlessly. */ // , , flushBuffer(); out.write(b, off, len); return; } if (len > buf.length - count) { flushBuffer(); } System.arraycopy(b, off, buf, count, len); count += len; } /** * Flushes this buffered output stream. This forces any buffered * output bytes to be written out to the underlying output stream. * * @exception IOException if an I/O error occurs. * @see java.io.FilterOutputStream#out */ // public synchronized void flush() throws IOException { flushBuffer(); out.flush(); } }


説明:BufferedOutputStreamのソースコードは非常に簡単です.ここでBufferedOutputStreamの考え方について簡単に説明します.BufferedOutputStreamはバイト配列でデータをバッファリングし、バッファがいっぱいになったり、ユーザーがflush()関数を呼び出したりすると、バッファのデータが出力ストリームに書き込まれます.
ソースコードから分かるように、BufferedOutputStreamのデフォルト構造関数は、バッファバイト配列のサイズが8*1024、すなわち8 Mである.
ここではpublic void write(byte[]b,int off,int len)について簡単に述べる.この関数は、b配列のoffから始まるlenバイトをファイルに書き込むことができるので、書き込むデータのサイズが変化している間に、比較的大きな配列を新規作成し、この関数によってデータを書き続け、異なるサイズの配列を作成しないようにすることができます.
Android BufferedOutputStreamの使用は終わりです.
簡単です.