7.2 jvm之io字节流
字节输入流
字节输入流概括
值得注意的地方有:
- Level 2的输入流,大多数都会指明数据源的形式:例如ByteArray,File,Piped
- Level 3的输入流,则不会出现具体的数据源名字,而是以功能取代:例如Buffered,LineNumber
所以说Level 3的输入流是对Level 2输入流的“封装和过滤”。实际上Level 3的输入流,都继承于FilterInputStream的输入流。
input stream介绍
- ByteArrayInputStream
从内存中每次读取一个字节的数据,然后保存到内置的缓冲区中。维持一个计数器用来记录从数据源中读入的字节数目。
调用该输入流的close()方法不会产生任何实际的作用。因为它“关闭”的对象是---内存。而不是文件。不会抛出任何的IOException。 - FileInputStream
从文件系统中读取原始的字节数据(raw bytes)。每次读取一个字节 - PipedInputStream
管道输入流,通常它的一端会和数据源连接,另一端和管道输出流(PipedOutputStream) 连接。这样从管输入流读入的任何数据将直接地传输到管道输出流。通常会有一个独的线程从管道输入流中读取数据,再交给另外一个线程,由另外的线程向管道输出流中写数据。如果使用单个线程进行读写操作,很容易造成资源的死锁。 - SequenceInputStream
把多个输入流按顺序合并成一个输入流 - DataInputStream
从底层的其它字节输入流中读取字节,然后转换成与机器无关的原始类型数据(boolean,byte,char) - BufferedInputStream
为底层的其它字节输入流增加一个“缓冲”的功能,除此之外还可以“标记”,“重置”输入流。当这个输出流的对象被创建时,一个内置的缓冲区也就被创建了。
随着底层的输入流的不断读入,缓冲区中的数据也在不同刷新。一次性地从底层的输入流读入多个字节,方便后续的转码工作
字节输出流
字节输出流概括
值得注意的是:
- 在Level 2的输出流,都是以功能来命名的。例如:Print,DataOutput,Buffered
- 在Level 3的输出流,则多数都是以数据源的形式来命名的。例如:ByteArray,File,Piped
所以说Level 2的输出流必须依赖于Level 3的输出流,实际上Level 2的输出流,都继承叫做FilterOutputStream的输出流
output stream介绍
- PrintStream
为底层的输出流添加额外的功能,令到底层的输出流可以方便地输出各种经过“格式化”的数据。和其它输出流不同,该输出流并不会抛出IOException,但是可以通过checkError方法来检查是否有异常发生。
该输出流具备自动flush功能,但写完一个字节数组,或者碰到一个println方法的调用,或者当要写出的字符是换行符时。会自动清空flush。默认情况下所有要写出的内存字符,都会被该输出流以平台默认编码方式,转换为字节流输出 - DataOutputStream
允许应用程序直接将基本类型数据(boolean, char, byte)直接写出到底层的输出流(内部转换为适当的字节) - BufferedOutputStream
为底层的输出流提供“缓冲”的功能,所有的写出请求和要写出的数据都会先缓冲到该输出流的缓冲区中,在适当的时机一次性写出。注意该类的write方法被调用时并不一定立即将内存中的数据写出到数据源,而可能先将数据缓存起来。 - ByteArrayOutputStream
该输出流能够将要写入内存的字节,先缓存到自身的缓冲区中。并且该缓冲区的大小可以自动增长。如果要从该输出流中提取字节,可以使用toByteArray,如果要还原为字符串,可以使用toString。关闭该输出流并不会产生任何的IOException,因为它的输出端是---内存而非文件。 - FileOutputStream
该输出流以原始字节(raw bytes)的方式向底层文件系统中写数据。在某些系统下,有时候只允许同一个文件
打开一个输出流。所以如果该文件已经被打开了,则再次打开一个输出流会抛出异常。