这篇博客主要介绍一下输入输出流中OutputStream这个抽象类
首先介绍一下这个类的结构:
OutputStream定义在java.id.OutputStream
包含四个函数:
public abstract void write(int b) throws IOException
public void write(byte[] data) throws IOException
public void write(byte[] data, int offset, int length) throws IOException
public void flush() throws IOException
public void close() throws IOException
其子类有的覆盖了部分函数,有的覆盖了全部函数,实现了抽象类中的抽象函数
有一个常用的从socket或是url获得输出流的函数
位于java.net.URLConnection
public OutputStream getOutputStream() throws IOException
我们在这并不关注这个输出流的具体类型,因为函数的覆盖实现了多态,我们可以在不清楚实现细节的情况下,通过抽象类中已经生命的方法名实现相应功能,通过抽象函数和函数的覆盖实现了多态,也体现了多态在面向对象的程序设计的优势所在
-----------------------------------打印一个byte---------------------------------------------------------------
public abstract void write ( int b ) throws IOException
打印一个字符,这个字符一定是在0~255之间的,如果超过这个范围的话会先对给出的int数值进行模运算之后再进行输出
可以利用try/catch块进行捕获异常
system.out这个实例并不会跑出IOException
下面给出一个小例子,打印ascii码表:
import java.io.*;
public class AsciiChart {
public static void main(String[] args)
{
for (int i = 32; i < 127; i++) {
System.out.write(i);
// break line after every eight characters.
if (i % 8 == 7) System.out.write('\n');
else System.out.write('\t');
}
System.out.write('\n');
}
}
----------------------------------打印一个byte数组----------------------------------------------------------
直接打印一整个byte数组比一个byte一个byte的打印,速度要快一些;
常用的函数是如下两个:
同样是write的两个重载的形式
public void write(byte[] data) throws IOException
public void write(byte[] data, int offset, int length) throws IOException
对于一个已知的字符串,java已经提供了一个函数来获取到它转化的byte[]类型的数组
string s;
s.getBytes();
第一个很显然就是直接输出,第二个则增添了两个参数,第一个offset是输出的子串的开始位置,第二参数length是输出的子串的长度
下面给出一个例子,它和上面的例子的输出结果是一样的,只是提前构造出了一个byte数组,再一次性输出出去
import java.io.*;
public class AsciiArray
{
public static void main(String[] args)
{
byte[] b = new byte[(127-31)*2];
int index = 0;
for (int i = 32; i < 127; i++)
{
b[index++] = (byte) i;
// Break line after every eight characters.
if (i % 8 == 7) b[index++] = (byte) '\n';
else b[index++] = (byte) '\t';
}
b[index++] = (byte) '\n';
try {
System.out.write(b);
}
catch (IOException e)
{ System.err.println(e); }
}
}
输出结果和第一个例子没有任何区别,如下:
虽然在这个例子中,一次性输出byte数组在效率上优势不明显,但是当输出一个规模较大的文件的时候就能体现出直接打印byte数组的优势所在
-----------------------------------flush和close函数操作OutputStream-------------------------------------------
许多输出流会利用buffer缓存来提高输出的效率,也就是不是一个byte一个byte的输出,而是将要输出的内容放入一段预留的缓存中,当缓存满时,在一起输出出去,但是对于不同的操作系统,可能函数的结果不尽相同
public void flush() throws IOException
如果输出的内容较少时,我们不需要显式的调用flush,因为输出流在关闭的时候会自动将缓存中的东西输出出去
我们只有在需要确保数据已经传输的情况下,才需要调用flush,比如网络通信的过程中,需要确保信息完全发送,才能接收到相应的回复
在调试程序中,有时候因为程序出现异常而崩溃导致缓存当中暂时存储的东西没有输出出来,在这个时候也可以通过flush及时的在程序崩溃前将要输出的内容输出出来
public void close() throws IOException
顾名思义,关闭输出流用的函数
system.out这个实例在每次调用println一类的输出函数时都会在输出之后调用一次flush来保证已经完整输出
---------------------------------如何继承OutputStream----------------------------------------------------------------
必须重载实现OutputStream当中的抽象函数write ( int b ),一般情况下输出write( byte[] ) , write( byte[] , int offset , int length ) 也会被重载
可以获取UI空间当中的输出流,来向UI界面中初始内容
对于最基本的OutputStream就暂且介绍这么多