意义:在基本的输入和输出流中,我们都是和字节打交道,但是在java类库中有些我们常用的格式来应付我们日常的工作,对于我这样的少年来说,都学不完啊,例如FTP传输文件的格式为zip格式。
过滤器流有两个版本:过滤器(处理字节,例如压缩和缓冲这些)和阅读/书写器(主要是使用编码格式处理文本)。这里我重点复习过滤器。
实例:
一。缓冲流(BufferedOutputStream和BufferedInputStream)
主要作用就是缓冲。
方法:每个过滤器输出流都和OutputStream相同的write(),close(),flush()方法(继承复习父亲方法的缘故)。每个过滤器输入流都和InputStream相同的read(),close()方法。
一般用法:通过构造方法和底层流链接--如上面的箭头。例如缓冲文件的输入:
InputStream filein = new FileInputStream("1.txt");
BufferedInputStream bfilein = BufferedInputStream (filein );
因为前面说过,过滤器也有像底层流的read/write/flush等方法(因为查看源码就可以知道BufferedInputStream间接继承了FilterInputStream,完全是内部是实现!),所以按照一般规则,构造好过滤器后,以后就可以使用这个链最后一个过滤器来对字节操作,而不是用底层流的方法了(FileInputStream),这样你就不会对底层流进行读写操作,从而不会破坏缓冲区。
具体缓冲流:
BufferedOutputStream--将数据缓冲在缓冲区(一个字节数组)中,知道缓冲区满或者刷出流,然后一次性写入底层流(见上图)。可见,对于网络传输的较大代价,一次写入很多数据比多次写入少量数据开销更小。
实例:
public class FileOutputStreamTest {
public static void main(String[] args) {
InputStream fileInputStream = null;
try {
File file = new File("save.txt");
fileInputStream = new BufferedInputStream(new FileInputStream(file));
int x ;
while(( x = fileInputStream.read())!= -1){
System.out.print((char)x);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fileInputStream!=null){
try{
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
BufferedOutputStream--也有一个字节数组最为缓冲区,当调用read()方法时,会请求缓冲区获得字节,只用当缓冲区(字节数组)没有字节了,才会从底层流(FileInputStream)读取字节,这是它就会尽量读取,不管你是否立即需要缓冲区中的字节。以为从磁盘读取字节,一个字节和一百字节几乎没有书读差距,所以缓冲区可以明显提升性能,明显来开对于网络不明显,因为巨大的报文段开销,例如额外的求和字节,网速等等。
实例:省略。
构造方法:BufferedOutputStream和BufferedOutputStream的构造方法差不多,以BufferedOutputStream代表复习一下
BufferedOutputStream(InputStream in):常用。
BufferedOutputStream(InputStream in, int bufferSize):指定缓冲区数组大小,默认为2048。
其他方法:
BufferedInputStream和BufferedOutputStream一样都是覆盖了原始流的方法(InputStream/OutputStream),没有新的方法,可以比喻为先进的可以缓冲字节的原始流,其中BufferedInputStream的有两个可以读取多个字节的read()方法,从而将底层流读取的字节尽量放进缓冲区,只有三种情况read()返回读取到的字节数:1。读完了2。数组填满3。底层流阻塞。
BufferedOutputStream的特殊在于,他是把你要“寄”出去的数据缓存起来,他也只有在缓冲区的数据慢时才“寄”出去,但是像我这样的小弟哪有那么多的数据要发啊,此时使用flush()方法把缓冲区还不愿意发出去的“小"数据刷出去才行。
二。数据流(DataInputStream和DataOutputStream)
主要作用就是数据格式的方面了。
他就是把相应的数据格式读取为二进制自己在中间中间介质中传输,
方法:略。
当然由于继承的原因,DataOutputStream也有write(),close(),flush()方法。DataInputStream也有read(),close()方法。
实例:
public class DataOutputStreamTest {
public static void main(String[] args) {
DataOutputStream out = null;
//使用OutputStream的话就无法使用writeChars,因为这是新方法
//OutputStream fileOutputStream = null;
try {
File file = new File("save.txt");
out =new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
String yuege = "yuege";
//byte[] yuegeByte = yuege.getBytes();
out.writeBytes(yuege);
} catch (IOException e) {
e.printStackTrace();
}finally{
if(out!=null){
try{
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}