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
* BufferedOutputStream
s 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の使用は終わりです.
簡単です.