在java的语言中所以的所有数据都是使用流读写的。那么什么是流呢?
流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备。
数据流的处理只能按照数据序列的顺序来进行,即前一个数据处理完之后才能处理后一个数据。数据流以输入流的形式被程序获取,再以输出流的形式将数据输出到其他设备。图 1 所示的是输入流模式,图 2 所示的是输出流模式。
Java 流功能相关的类都封装在 java.io 包中,而且每个数据流都是一个对象。所有输入流类都是InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类,其层次结构如图 3 所示。
InputStream 类中所有方法遇到错误时都会引发 IOException 异常。如下是该类中包含的常用方法。
Ø int read():从输入流读入一个 8 字节的数据,将它转换成一个 0~255 的整数,返回一个整数,如果遇到输入流的结尾返回 -1。
Ø int read(byte[] b):从输入流读取若干字节的数据保存到参数 b 指定的字芳数组中,返回的字芾数表示读取的字节数,如果遇到输入流的结尾返回 -1。
Ø int read(byte[] b,int off,int len):从输入流读取若干字节的数据保存到参数 b 指定的字节数组中,其中 off 是指在数组中开始保存数据位置的起始下标,len 是指读取字节的位数。返回的是实际读取的字节数,如果遇到输入流的结尾则返回 -1。
Ø void close():关闭数据流,当完成对数据流的操作之后需要关闭数据流。
Ø int available():返回可以从数据源读取的数据流的位数。
Ø skip(long n):从输入流跳过参数 n 指定的字节数目。
Ø boolean markSupported():判断输入流是否可以重复读取,如果可以就返回 true。
Ø void mark(int readLimit):如果输入流可以被重复读取,从流的当前位置开始设置标记,readLimit 指定可以设置标记的字苟数。
Ø void reset():使输入流重新定位到刚才被标记的位置,这样可以重新读取标记过的数据。
上述最后 3 个方法一般会结合在一起使用,首先使用 markSupported() 判断,如果可以重复读取,则使用 mark(int readLimit) 方法进行标记,标记完成之后可以使用 read() 方法读取标记范围内的字节数,最后使用 reset() 方法使输入流重新定位到标记的位置,继而完成重复读取操作。 Java 中的字符是 Unicode 编码,即双字节的,而 InputerStream 是用来处理单字节的,在处理字符文本时不是很方便。这时可以使用 Java 的文本输入流 Reader 类,该类是字符输入流的抽象类,即所有字输入流的实现都是它的子类。
Reader类的具体层次结构如图 4 所示.
Reader类常用方法如下:
Ø public int read(java.nio.CharBuffer target):读取字节到字符缓存中。
Ø public int read():读取单个字符。
Ø public int read(char cbuf[]):读取字符到指定的 char 数组中。
Ø abstract public int read(char cbuf[], int off, int len):从 off 位置读取 len 长度的字符到 char 数组中。
Ø public long skip(long n):跳过指定长度的字符数量。
Ø public boolean ready():和上面的 available() 方法类似。
Ø public boolean markSupported():判断当前流是否支持标记流。
Ø public void mark(int readAheadLimit):标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断。
Ø public void reset():重置读取位置为上次 mark 标记的位置。
Ø abstract public void close():关闭流释放相关资源。
在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类,其层次结构如图 5 所示。
OutputStream 类是所有字节输出流的超类,用于以二进制的形式将数据写入目标设备,该类是抽象类,不能被实例化。OutputStream 类提供了一系列跟数据输出有关的方法,如下所示。
Ø int write (b):将指定字节的数据写入到输出流。
Ø int write (byte[] b):将指定字节数组的内容写入输出流。
Ø int write (byte[] b,int off,int len):将指定字节数组从 off 位置开始的 len 字芳的内容写入输出流。
Ø close():关闭数据流,当完成对数据流的操作之后需要关闭数据流。
Ø flush():刷新输出流,强行将缓冲区的内容写入输出流。
字符输出流的父类是 Writer,其层次结构如图 6 所示。
图6 Writer类的层次结构图
Writer类常用方法如下:
Ø public void write(int c):写入一个字符。
Ø public void write(char cbuf[]):写入一个字符数组。
Ø abstract public void write(char cbuf[], int off, int len):从字符数组的 off 位置写入 len 数量的字符。
Ø public void write(String str):写入一个字符串。
Ø public void write(String str, int off, int len):从字符串的 off 位置写入 len 数量的字符。
Ø public Writer append(CharSequence csq):追加吸入一个字符序列。
Ø public Writer append(CharSequence csq, int start, int end):追加写入一个字符序列的一部分,从start 位置开始,end 位置结束。
Ø public Writer append(char c):追加写入一个 16 位的字符。
Ø abstract public void flush():强制刷新,将缓冲中的数据写入。
Ø abstract public void close():关闭输出流,流被关闭后就不能再输出数据了。
下面就对常用子类使用进行代码演示说明:
(未完待续……)
下面给大家分享一下广西威扬对于软件测试的进阶课程大纲:
如果需要详细了解试听或培训课程费用可留下 姓名+联系方式(手机号或微信号),我们会在第一时间为您解答服务!
软件测试零基础班
软件测试周末精品班
java开发班
ISTQB考试班
更多资讯尽在官方网站
www.njzhenghou.com