`

BufferedOutputStream 源码分析

阅读更多
BufferedOutputStream实现了一个缓冲输出流。构建了这样一个输出流后,应用可以往底层流写数据而不用每次写一个字节都调用底层流的方法。

public class BufferedOutputStream extends FilterOutputStream {

	// 内部缓冲区,存储数据
	protected byte buf[];

	// 缓冲区中有效的字节数(0 ~ buf.length)
	protected int count;

	// 构造方法,创建一个新的输出缓冲流,并把数据写到指定的底层输出流
	public BufferedOutputStream(OutputStream out) {
		this(out, 8192);
	}

	// 构造方法,创建一个新的输出缓冲流,以将具有指定缓冲区大小的数据写到指定的底层输出流。
	public BufferedOutputStream(OutputStream out, int size) {
		super(out);
		if (size <= 0) {
			throw new IllegalArgumentException("Buffer size <= 0");
		}
		buf = new byte[size];
	}

	// 刷新内部的缓冲区,这会让内部缓冲区的有效字节被写出到此缓冲的输出流中
	private void flushBuffer() throws IOException {
		if (count > 0) {
			out.write(buf, 0, count);
			count = 0;
		}
	}

	// 将指定的字节写入此缓冲的输出流
	public synchronized void write(int b) throws IOException {
		// 如果缓冲区满,则刷新缓冲区
		if (count >= buf.length) {
			flushBuffer();
		}
		buf[count++] = (byte)b;
	}

	// 将指定字节数组中的从偏移量off开始len个字节写入此缓冲的输出流
	public synchronized void write(byte b[], int off, int len) throws IOException {
		if (len >= buf.length) {
			// 如果待写入的字节数大于或等于缓冲区大小,刷新缓冲区,并直接写入到输出流中
			flushBuffer();
			out.write(b, off, len);
			return;
		}
		if (len > buf.length - count) {
			flushBuffer();
		}
		System.arraycopy(b, off, buf, count, len);
		count += len;
	}

	// 刷新此缓冲区和输出流,这会使所有缓冲的输出字节被写出到底层输出流中
	// 为了让缓冲区的数据能被写入到底层输出流中,可以显式调用该方法。或者调用close()方法(父类FilterOutputStream的close()方法),在close方法里,调用该flush()方法
	public synchronized void flush() throws IOException {
		flushBuffer();
		out.flush();
	}
}
分享到:
评论

相关推荐

    FilterOutputStream 源码分析

    《FilterOutputStream 源码分析》 FilterOutputStream是Java IO流中的一个重要类,它是所有过滤输出流的基础。在Java编程中,我们经常需要对输入输出流进行操作,比如添加一些额外的功能,如缓冲、编码转换等,这时...

    疯狂Java flashget源码

    源码中可能会用到BufferedInputStream和BufferedOutputStream来提高I/O效率,以及HttpURLConnection或HttpClient类来处理HTTP请求。 4. **进度跟踪与断点续传**:为了提供用户友好的体验,FlashGet支持下载进度显示...

    Java传输文件(附有源码)

    总结来说,"Java传输文件"是一个综合性的主题,它结合了文件I/O、网络编程、多线程、源码分析和安全性等多个方面。通过学习这些知识点,开发者能够构建出高效且安全的文件传输解决方案。提供的源码和jar文件为实践和...

    java下载程序源码

    - `download(String path, HttpServletResponse response)` 方法中,使用了`BufferedInputStream`和`BufferedOutputStream`来提高读写效率,它们分别从文件中读取数据并写入到响应中。 - `downloadLocal...

    Java版飞鸽传书文件传输源码.rar

    源码中可能会使用BufferedInputStream和BufferedOutputStream来提高读写效率,并通过DataInputStream和DataOutputStream进行数据结构的序列化和反序列化。 5. **用户界面**:虽然描述中没有提及,但通常一个完整的...

    Java从网络取得文件Demo源码.zip

    在Java编程环境中,从网络获取文件是一项常见的任务,特别是在开发Web应用、下载更新或实现数据同步等场景。这个"Java从网络取得文件...通过阅读和分析这些源码,开发者可以加深对Java网络API的理解,提升开发能力。

    java源码:Java二进制IO类与文件复制操作实例.rar

    这个示例源码提供了关于Java二进制IO类和文件复制操作的实际应用,对于学习和理解这一主题非常有用。通过分析和实践这些代码,开发者可以更好地掌握Java的文件处理能力,为日常开发工作奠定坚实基础。

    将大文件分割及合并java源码

    在IT行业中,处理大文件是一项常见的任务,尤其是在网络传输、存储和备份等场景。当大文件需要被分块处理或在网络上传输时,文件...通过深入分析和理解这段代码,开发者可以将其应用于自己的项目中,解决类似的问题。

    Java版开源Winzip压缩工具源码

    在这个项目中,会用到FileInputStream、FileOutputStream等类来处理文件,以及BufferedInputStream、BufferedOutputStream提高读写效率。 2. **压缩与解压缩算法**:项目可能采用了ZipOutputStream和ZipInputStream...

    Java带密码压缩zip与解压文件源码Java实用源码整理learns

    本篇文章将深入探讨如何使用Java实现带密码的ZIP文件压缩和解压缩功能,结合给定的文件名列表,我们将讲解核心概念、源码分析以及实际应用。 首先,我们需要了解Java中的`java.util.zip`包,它提供了对ZIP和GZIP...

    Project7_学生信息_源码

    7. 源码分析 虽然具体的源码没有提供,但我们可以假设项目中包含了至少一个Student类,该类封装了学生的信息,并提供了读写文件的方法。这些方法可能使用了上述的I/O流技术,如使用BufferedReader从文件中读取学生...

    commons-io-2.4 包含了所有commons-io的jar包和源码

    10. **源码分析**:由于包含源码,开发者可以深入理解Apache Commons IO库的内部工作原理,学习优秀的编程实践,并根据需求进行扩展或定制。 Apache Commons IO 是Java开发中的重要辅助库,它的功能强大且实用,...

    java版飞鸽传书源码,java版飞鸽传书源码

    总的来说,Java版飞鸽传书源码是一个宝贵的教育资源,通过分析和学习,我们能够深入了解网络通信的原理,提高我们的编程和系统设计能力。无论你是Java初学者还是经验丰富的开发者,都能从中受益匪浅。

    飞鸽传书java版源码

    通过分析源码,可以了解实际项目中的问题解决策略,提升编程技巧,为开发类似应用提供思路。 总之,飞鸽传书Java版源码是一份宝贵的教育资源,它揭示了网络通信软件的实现细节,帮助我们更深入地理解Java在网络编程...

    JAVA就业培训教程_源码

    这个教程结合了理论讲解与实际源码分析,旨在提供一个全面且深入的学习路径,帮助学员掌握Java编程的核心概念,并具备实际项目开发的能力。以下是教程中的关键知识点: 1. **Java基础**: - **变量与数据类型**:...

    疯狂java讲义源码

    通过对压缩包文件“疯狂java讲义”的分析,我们可以提炼出一系列重要的Java知识点。 1. **Java基础** - 类与对象:Java是一种面向对象的语言,类是对象的模板,对象则是类的实例。 - 变量与数据类型:包括基本...

    用Java实现的解压缩程序实例(含源码)

    5. **源码分析**: - 源码可能包含一个名为`unzip()`的函数,这是解压缩的主要逻辑。函数接收ZIP文件的输入流和目标解压目录作为参数。 - 在`unzip()`函数内部,可能会有一个循环来遍历`ZipInputStream`的所有条目...

    21.【缓冲流、转换流、序列化流、打印流】(1)_缓冲流_源码

    在学习这些流的使用时,可以结合源码分析其工作原理,了解内部缓冲区的管理、数据的读写策略等。`21.【缓冲流、转换流、序列化流、打印流】-笔记`文件可能包含了详细的解释和示例代码,通过阅读这份笔记,可以更深入...

Global site tag (gtag.js) - Google Analytics