Java的I/O建立于流上。输入流读取数据;输出流写入数据。所有的输出流/输入流都有相同的基本方法来写入/读取数据。
过滤器流可以链接到输入流或输出流上。过滤器可以在读写时修改数据或者只是提供额外的方法,将读写的数据转换为其他格式。
阅读器和书写器可以链接到输入流和输出流上,可以读写文本(即字符)而不是字节。
流是同步的:当线程请求一个流读写一部分数据时,在进行任何其他操作前,它要等待被读写的数据。
1、输入流:Java的基本输入流是java.io.InputStream:
public abstract class InputStream
这个类提供了将数据读取为原始字节所需的基本方法:
InputStream的具体子类使用这些方法从某种媒介中读取数据。基本方法是没有参数的read()方法,声明为抽象方法,这个方法从输入流的院中读取一个字节数据,作为一个0-255的int返回。流的结束由返回-1表示。read()方法会等待并阻塞其后任何代码的执行,直到有一字节的数据可用,准备读取。若程序在进行其他重要的操作,尝试将 I/O放在自己的线程中。
2、输出流:java的基本输出流类是java.io.OutputStream:
public abstract class OutputStream
这个类提供了写入数据所需的基本方法:
OutputStream的子类使用这些方法向某种媒体写入数据。基本方法是write(int b),这个方法接受一个0-255之间的整数作为参数,将对应的字节写入到输出流中,声明为抽象方法。
为了提高效率,减少开销,大多数TCP/IP的实现都会在某种程度上缓存数据。即,它们在内存中积累数据,只有积累到一定量的数据后,或者经过了一段时间后,才将所积累的数据发送到最终目的地。
3、过滤器流:Java提供了很多过滤器流,可以附加到原始流中,在原始字节和各种格式之间来回转换。过滤器有两个版本:过滤器流及阅读器和书写器。
过滤器流主要将原始数据作为字节操作;过滤器以链的形式进行组织,链中的每个环节都接收前一个过滤器或流的数据,并把数据传递给链中的下一个环节。
过滤器通过构造函数与流连接。
4、缓冲流:BufferedOutputStream类将待写入的数据存储在缓冲区中,直到缓冲区满或刷新输出流。然后它将数据一次全部写入底层输出流。
BufferedInputStream类也有作为缓冲区的名为buf的保护字节数组。当调用某个流的read()方法时,它首先尝试从缓冲区获取请求的数据。只有当缓冲区没有数据时,流才从底层的源中读取。这是它会从源中读取尽可能多的数据进入缓冲区,而不管它是否马上需要多有的这些数据。
①、PrintStream:多数程序员会遇到的第一个过滤器输出流,因为System.out就是一个PrintStream。(编程尽可能不用,缺点太多)
②、PushbackInputStream:是FilterInputStream的子类。FilterInputStream提供了一个回压(pushback)堆栈,这样程序可以向输入流”unread“(压写)字节。这使得程序可以向运行中的流添加数据。它们在从底层输入流中读取前,会首先尝试从回压缓冲区中读取。实际上,这个缓冲区就是位于输入流顶部堆栈,只有当堆栈空时才会读取底层的流。
③、数据流:DataInputStream和DataOutputStream提供了一些方法,可以用二进制格式读写Java的简单数据类型和字符串。所用的二进制格式主要用于在两个不同的java程序之间交换数据,而无论是通过网络连接、数据文件、管道还是其他媒介。输出流写入什么市局,输入流就能够读取什么数据。
④、压缩流:java.util.zip包中包含压缩和解压zip、gzip及deflate格式流的过滤器流。除了广泛应用于文件外,这个包还允许java应用程序通过网络轻松地交换压缩数据。
⑤、摘要流:可以计算流的消息摘要(用于数字签名,检测数据是否遭到破坏)。DigestInputStream和DigestPutputStream。
⑥、加密流:javax.crypto包中的CipherInputStream和CipherPutputStream类提供了加密和解密服务。
4、阅读器和书写器:为了应对不同的编码方式,处理字节而不是字符。
①书写器:Writer类映射了java.io.OutputStream类。OutputStreamWriter是Writer的最重要的具体子类。OutputStreamWriter会从java程序接收字符,根据指定的编码方式将这些字符转换为字节,写入底层输出流中。
②阅读器:Reader类是java.io.InputStream类的镜像。
③过滤器阅读器和书写器:
④PrintWriter:能够正确处理多字节字符集和国际化文本。用来替代PrintStream。