`

源码剖析之java.io.OutputStream

阅读更多
java输出流的高层抽象:java.io.OutputStream
此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。
需要定义 OutputStream 子类的应用程序必须始终提供至少一种可写入一个输出字节的方法


OutputStream 实现了两个接口:
1、Closeable:定义输出流需要关闭操作。关闭此输出流并释放与此流有关的所有系统资源。
2、Flushable:定义输出流需要刷新此输出流并强制写出所有缓冲的输出字节。

特点:和java.io.InputStream一样,他的底层就是byte数组的各自操作
我们来瞅瞅它的定义吧。
public abstract class OutputStream implements Closeable, Flushable {
    /**
     * Writes the specified byte to this output stream. The general 
     * contract for <code>write</code> is that one byte is written 
     * to the output stream. The byte to be written is the eight 
     * low-order bits of the argument <code>b</code>. The 24 
     * high-order bits of <code>b</code> are ignored.
     写如果特定的byte到 当前的OutputStream输出流,对于int 占用4个字节,只会写入低8位,其他忽略掉。
     
     * <p>
     * Subclasses of <code>OutputStream</code> must provide an 
     * implementation for this method. 
     *
     * @param      b   the <code>byte</code>. 
     * @exception  IOException  if an I/O error occurs. In particular, 
     *             an <code>IOException</code> may be thrown if the 
     *             output stream has been closed.  特别:如果已经关闭再写入,会抛出IOException异常。
     */
    public abstract void write(int b) throws IOException;

    /**
     *写入b数组的所有数据
     */
    public void write(byte b[]) throws IOException {
     	write(b, 0, b.length);
    }

    /**
     *  把b的字节数组中的数据,从b[off] 到b[off+len-1] 逐个的按顺序的写入到输出流
     *  这个方法是循环调用write(int)方法,子类最好能覆盖此方法以提供更有效的实现
     *
     * @param      b     the data.
     * @param      off   the start offset in the data. 代表从b 字节数组的何处开始取数据
     * @param      len   the number of bytes to write. 从b字节数组取 len长度的数据
     * 
     */
    public void write(byte b[], int off, int len) throws IOException {
	if (b == null) {
	    throw new NullPointerException();
	} else if ((off < 0) || (off > b.length) || (len < 0) ||
		   ((off + len) > b.length) || ((off + len) < 0)) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0) {
	    return;
	}
	for (int i = 0 ; i < len ; i++) {
	    write(b[off + i]);
	}
    }

    /**
     *【jdk解释:】 
     刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。 
       如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。 
     */
    public void flush() throws IOException {
    }

    /**
     * 关闭此输出流并释放与此流有关的所有系统资源。close 的常规协定是:该方法将关闭输出流。关闭的流不能执行输出操作,也不能重新打开。 
     */
    public void close() throws IOException {
    }

}

分享到:
评论

相关推荐

    java.io.Reader 和 java.io.InputStream 的区别

    ### Java.io.Reader与Java.io.InputStream的关键差异解析 在深入探讨`java.io.Reader`与`java.io.InputStream`的具体差异之前,我们首先需要理解这两者在Java I/O操作中的基础角色。`java.io.Reader`和`java.io....

    Java.nio 与Java.io比较

    在探讨Java.nio与Java.io之间的比较时,我们首先需要理解这两个包在Java编程语言中的核心作用和它们各自的优势。Java.io和Java.nio是Java中处理输入/输出操作的两个主要框架,它们各自拥有独特的特性和应用场景。 #...

    java.io的基础应用

    在Java中,IO操作主要分为字节流和字符流两大类,分别由`java.io.InputStream`和`java.io.OutputStream`以及`java.io.Reader`和`java.io.Writer`作为基类。字节流处理的是8位的字节,而字符流处理的是16位的Unicode...

    android 串口驱动

    import java.io.OutputStream; import android.util.Log; public class SerialPort { private static final String TAG = "SerialPort"; /* * Do not remove or rename the field mFd: it is used by native...

    java.io包详细解说

    Java IO包是Java标准库中的核心组件之一,主要用于处理输入和输出操作。这个包包含了大量类和接口,它们提供了各种输入输出流、字符编码、数据转换以及文件操作等功能。Java IO的设计采用了Decorator模式,使得在不...

    rxtx-2.1.7.jar串口通信gnu.io包不存在问题

    在Java编程环境中,进行串口通信时,常常会遇到一个问题:缺少`gnu.io`包,导致无法正常编译或运行程序。这个问题主要出现在使用RXTX库进行串口操作的项目中。RXTX是一个开源的Java库,它提供了与硬件进行串行通信的...

    JBuider第八章:Java.io包.rar

    Java.io包是Java编程语言中的核心包之一,它包含了用于输入/输出操作的类和接口。这个包在Java中扮演着至关重要的角色,因为它提供了处理数据流、字符流、对象序列化、文件读写以及与操作系统交互的各种工具。在本...

    java项目超市

    import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; import login.Choice; import org.dom4j.DocumentException;...

    java.io的吐血实用例子

    在Java编程语言中,`java.io`包是用于输入/输出(I/O)操作的基础部分,包含了许多类和接口,使得开发者能够处理数据流、字符流、对象序列化、磁盘文件以及网络连接等任务。本篇文章将深入探讨`java.io`包中的关键概念...

    java 读写EXEcel文档范例

    import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi....

    java.io详解

    ### Java IO流详解 #### 一、Java IO流概述 Java IO流是Java标准库中的一个重要组成部分,主要用于处理数据的输入输出操作。根据处理的数据类型不同,Java IO流被分为两大类:字节流(byte streams)和字符流...

    使用JAVA.IO流线程的JAVA课设项目万年历记事本

    - Java.IO流库提供了处理输入和输出数据的类,允许程序读取和写入数据到各种源和目的地,如文件、网络连接、内存缓冲区等。 - **输入流**(InputStream)用于读取数据,而**输出流**(OutputStream)用于写入数据...

    java常用的工具类整理28个

    19. **java.io.InputStream**和**java.io.OutputStream**:所有字节流的基类,提供了基本的读写操作。 20. **java.io.Reader**和**java.io.Writer**:所有字符流的基类,用于处理字符数据。 21. **java.io....

    java7源码-JavaIO:JavaIO

    java.io.OutputStream java.io.Reader java.io.Writer 4. FileInputStream和FileOutputStream是什么? 这是在拷贝文件操作的时候,经常用的两个类。在处理小文件的时候,它们的性能还不错,在大文件是最好使用...

    java.lang.IllegalStateException: OutputStream already obtain

    标题 "java.lang.IllegalStateException: OutputStream already obtain" 涉及到的是Java编程中的一个常见错误,特别是当处理I/O流时。这个异常通常在尝试获取已经存在的OutputStream实例时抛出,表明该输出流已经被...

    Java IO commons-io-2.5.jar

    相较于Java标准库中的`java.io.File`类提供的`copy()`方法,`commons-io`的`FileUtils.copyFile()`更简单易用,且异常处理更简洁。 总的来说,`commons-io-2.5.jar` 是Java开发者的强大工具,它极大地扩展了Java IO...

    计算机网络实验报告 获取MAC socket通信

    java.io.OutputStream os = new java.io.DataOutputStream( sk.getOutputStream()); // 利用网络输出流将文件传到客户端 边读边发送 int len=0; byte[] buff = new byte[1024]; while((len=fis.read(buff))...

    Java学习IO流小结--字符流

    - `java.io.FileReader` → `java.io.Reader` → `java.lang.Object` - `java.io.FileWriter` → `java.io.Writer` → `java.lang.Object` - **构造方法**: - `FileReader(String fileName)`:创建一个`...

    Java语言程序设计完整版资料.ppt

    - 抽象基类:`java.io.InputStream` 和 `java.io.OutputStream` 提供了基本的读写方法。 - 实现类:如 `java.io.FileInputStream` 和 `java.io.FileOutputStream` 用于文件读写,`java.io.BufferedInputStream` 和...

Global site tag (gtag.js) - Google Analytics