您的位置 首页 java

详解Java I/O流(二),字节流

InputStream和OutputStream

InputStream 是输入流,前面已经说到,它是从数据源对象将数据读入程序内容时,使用的流对象。通过看 InputStream 的源码知道,它是一个抽象类,

 1public abstract class InputStream  extends Object  implements Closeable
2  

提供了一些基础的输入流方法:

  1//从数据中读入一个字节,并返回该字节,遇到流的结尾时返回-1
 2abstract int read() 
 3
 4//读入一个字节数组,并返回实际读入的字节数,最多读入b.length个字节,遇到流结尾时返回-1
 5int read(byte[] b)
 6
 7// 读入一个字节数组,返回实际读入的字节数或者在碰到结尾时返回-1.
 8//b:代表数据读入的数组, off:代表第一个读入的字节应该被放置的位置在b中的偏移量,len:读入字节的最大数量
 9int read(byte[],int off,int len)
10
11// 返回当前可以读入的字节数量,如果是从网络连接中读入,这个方法要慎用,
12int available() 
13
14//在输入流中跳过n个字节,返回实际跳过的字节数
15long skip(long n)
16
17//标记输入流中当前的位置
18void mark(int readlimit) 
19
20//判断流是否支持打标记,支持返回true
21boolean markSupported() 
22
23// 返回最后一个标记,随后对read的调用将重新读入这些字节。
24void reset() 
25
26//关闭输入流,这个很重要,流使用完一定要关闭
27void close()
28  

直接从 InputStream 继承的流,可以发现,基本上对应了每种数据源类型。

详解Java I/O流(二),字节流

功能

  • ByteArrayInputStream 将字节数组作为 InputStream
  • StringBufferInputStream 将String转成InputStream
  • FileInputStream 从文件中读取内容
  • PipedInputStream 产生用于写入相关PipedOutputStream的数据。实现管道化
  • SequenceInputStream 将两个或多个InputStream对象转换成单一的InputStream
  • FilterInputStream 抽象类,主要是作为“装饰器”的接口类,实现其他的功能流

OutputStream 是输出流的抽象,它是将程序内存中的数据写入到目的地(也就是接收数据的一端)。看下类的签名:

 1public abstract class OutputStream implements Closeable, Flushable {}  

提供了基础方法相比输入流来说简单多了,主要就是write写方法(几种重载的方法)、flush冲刷和close关闭。

  1// 写出一个字节的数据
 2abstract void write(int n)
 3
 4// 写出字节到数据b
 5void write(byte[] b)
 6
 7// 写出字节到数组b,off:代表第一个写出字节在b中的偏移量,len:写出字节的最大数量
 8void write(byte[] b, int off, int len)
 9
10//冲刷输出流,也就是将所有缓冲的数据发送到目的地
11void flush()
12
13// 关闭输出流
14void close()
15  

同样地,OutputStream也提供了一些基础流的实现,这些实现也可以和特定的目的地(接收端)对应起来,比如输出到字节数组或者是输出到文件/管道等。

功能

  • ByteArrayOutputStream 在内存中创建一个缓冲区,所有送往“流”的数据都要放在此缓冲区
  • FileOutputStream 将数据写入文件 PipedOutputStream 和PipedInputStream配合使用。实现管道化
  • FilterOutputStream 抽象类,主要是作为“装饰器”的接口类,实现其他的功能流

详解Java I/O流(二),字节流

使用装饰器包装有用的流

Java IO 流体系使用了装饰器模式来给哪些基础的输入/输出流添加额外的功能。这写额外的功能可能是:可以将流缓冲起来提高性能、是流能够读写基本数据类型等。

这些通过装饰器模式添加功能的流类型都是从 FilterInputStream FilterOutputStream 抽象类扩展而来的。可以看第一篇文章最开始说到IO流体系的层次时,那几种图加深下印象。

功能

  • DataInputStream 和DataOutputStream搭配使用,使得流可以读取int char long等基本数据类型
  • BufferedInputStream 使用缓冲区,主要是提高性能
  • LineNumberInputStream 跟踪输入流中的行号,可以使用getLineNumber、setLineNumber(int)
  • PushbackInputStream 使得流能弹出“一个字节的缓冲区”,可以将读到的最后一个字符回退

FilterOutStream类型

详解Java I/O流(二),字节流

功能

  • DataOutputStream 和DataInputStream搭配使用,使得流可以写入int char long等基本数据类型
  • PrintStream 用于产生格式化的输出
  • BufferedOutputStream 使用缓冲区,可以调用flush()清空缓冲区

大多数情况下,其实我们在使用流的时候都是输入流和输出流搭配使用的。目的就是为了转移和存储数据,单独的read()对我们而言有啥用呢,读出来一个字节能干啥?对吧。因此要理解流的使用就是搭配起来或者使用功能流组合起来去转移或者存储数据。

文章来源:智云一二三科技

文章标题:详解Java I/O流(二),字节流

文章地址:https://www.zhihuclub.com/183840.shtml

关于作者: 智云科技

热门文章

网站地图