Rumah  >  Artikel  >  Java  >  Bagaimanakah mekanisme penimbal bagi aliran Java I/O dilaksanakan?

Bagaimanakah mekanisme penimbal bagi aliran Java I/O dilaksanakan?

王林
王林asal
2024-04-13 15:06:021018semak imbas

Strim I/O Java menyediakan mekanisme penimbalan melalui BufferedInputStream dan BufferedOutputStream untuk meningkatkan prestasi baca dan tulis. BufferedInputStream membaca data daripada aliran input asas dan menyimpannya dalam penimbal dalaman, meningkatkan prestasi pada bacaan kerap bagi blok data kecil. BufferedOutputStream menulis data ke penimbal dalaman dan, apabila penimbal penuh atau perlu disiram dengan segera, ke aliran keluaran asas, mengoptimumkan prestasi untuk menulis jarang blok data besar. Mekanisme Penimbalan Java I/O Streams Apabila beroperasi pada penimbal, operasi I/O dilakukan pada penimbal dan bukannya terus pada fail atau strim asas. Ini menjimatkan masa panggilan sistem dan penukaran konteks.

Java I/O流的缓冲机制是如何实现的?Pelaksanaan mekanisme penimbalan

Mekanisme penimbal dalam aliran Java I/O dilaksanakan dengan menggunakan BufferedInputStream

dan

BufferedOutputStream aliran input/output. Strim ini mengandungi penimbal dalaman untuk menyimpan blok data dalam ingatan.

BufferedInputStream

BufferedInputStream membaca data dan menyimpannya dalam penimbal dalaman. Apabila penimbal diisi, strim membaca satu lagi blok data daripada aliran input asas, mengisi penimbal dan mengembalikan bait pertama dalam penimbal. Ini meningkatkan prestasi pada bacaan kerap blok data kecil.

BufferedOutputStreamBufferedOutputStream menulis data ke penimbal dalaman. Apabila penimbal penuh atau data perlu disiram dengan segera, strim menulis data dalam penimbal ke aliran keluaran asas. Ini mengoptimumkan prestasi untuk menulis jarang ke blok data yang besar, mengurangkan bilangan panggilan sistem.

Contoh Praktikal

Pertimbangkan kod berikut, yang menggunakan BufferedInputStream untuk membaca dalam fail teks:

try (BufferedInputStream in = new BufferedInputStream(new FileInputStream("input.txt"))) {
    byte[] buf = new byte[1024];
    int bytesRead;

    while ((bytesRead = in.read(buf)) != -1) {
        System.out.write(buf, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}
BufferedInputStream 读入数据并存储在内部缓冲区中。当缓冲区填满时,流会从底层输入流中读取另一个数据块,填充缓冲区,并返回缓冲区中的第一个字节。这提高了对小数据块频繁读取的性能。

BufferedOutputStream

BufferedOutputStream 将数据写入内部缓冲区。当缓冲区已满或者需要立即刷新数据时,流将缓冲区中的数据写入底层输出流。这优化了对大数据块的不频繁写入的性能,减少了系统调用的数量。

实战案例

考虑以下代码,它使用 BufferedInputStream 读入一个文本文件:

rrreee

在此示例中,BufferedInputStream 将数据分块读入内部缓冲区,从而提高了对小数据块频繁读取的性能。

需要注意的点

  • 缓冲区大小会影响性能。较大的缓冲区可以减少系统调用的数量,但也会消耗更多的内存。
  • BufferedInputStreamBufferedOutputStream 类的缓冲区是通过 java.io.BufferedInputStream.DEFAULT_BUFFER_SIZE (默认为 8192 字节)指定的,您可以在构建流实例时覆盖此值。
  • 当使用 flush() 方法时,BufferedOutputStream 会立即将缓冲区中的数据写入底层输出流,而 BufferedInputStreamDalam contoh ini, BufferedInputStream membaca data dalam ketulan Penampan dalaman, dengan itu meningkatkan prestasi pada bacaan kerap blok data kecil.
🎜Perhatian🎜🎜
  • Saiz penimbal mempengaruhi prestasi. Penampan yang lebih besar mengurangkan bilangan panggilan sistem, tetapi juga menggunakan lebih banyak memori. 🎜
  • Penimbal untuk kelas BufferedInputStream dan BufferedOutputStream ditentukan melalui java.io.BufferedInputStream.DEFAULT_BUFFER_SIZE (lalai ialah 8192 bait) , anda boleh mengatasi nilai ini apabila membina contoh strim. 🎜
  • Apabila menggunakan kaedah flush(), BufferedOutputStream akan segera menulis data dalam penimbal ke aliran keluaran asas, manakala BufferedInputStream Penampan disiram apabila semua data dibaca daripada penimbal atau apabila strim ditutup. 🎜🎜

Atas ialah kandungan terperinci Bagaimanakah mekanisme penimbal bagi aliran Java I/O dilaksanakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn