Java缓冲区之输入输出流

来源:互联网 发布:程序员怎么保护颈椎 编辑:程序博客网 时间:2024/04/30 17:36

Java缓冲区之输入输出流

--模范青蛙

 

下面我想通过一个例子来简单介绍一下流在缓冲区是怎么被读写的。

InputStream OutputStream Reader Writer都是抽象类,他们本身并没有实现多少方法,本身又为抽象类,我们无法创建他们的对象,只能使用多态来创建子类的对象。来实现具体的功能。

    字符流的底层都是通过字节流来操作的,在这里只拿字节流的一个例子来分析一下。

    所讲的内容完全是根据以下代码分析的,希望读者也能结合代码收看。

    当编译器把Test_01.java编译过后,会生成一个Test_01.class文件,我们也通常称它为字节码文件,虚拟机启动时会把这个字节码文件加载到内存,至于是如何加载到内存的,我在另一篇文章中有详细的记录。http://download.csdn.net/detail/mo_fan_qing_wa/8990107在这里就不重复造轮子了。之后虚拟机会找到main(),按照这里面的代码,一步一步的执行。下面我们首先会看到一个try{}catch(){}语句,这是由于在创建对象时,需要指定创建文件的位置,如果指定的位置不存在,就会出现IOException异常,所以在整个步骤中,需要对IO异常进行try处理。下面看第二行代码:

InputStream in=new FileInputStream("d:\\a.java");//它的作用就是将d盘下的a.java文件封装成一个对象(in),在执行BufferedInputStream bin=new BufferedInputStream(in);第二行代码的时候,把这个对象(in)作为参数传入,BufferedInputStream 会通过内部的fill()方法和流对象in来填充它内部的缓冲区。

我们通过查看这个类BufferedInputStream的源码可以发现,在这个类中定义了一个私有的静态常量“private static int defaultBufferSize = 8192;”初始值是8k,

也许有人会问,这个in对象是如何被读入的?

下面来简单分析一下:在初始化的时候,BufferedInputStream 会通过内部的fill()方法和流对象in来填充它内部的缓冲区,每当读取够8K,就会往内存发送一次数据,直到将这个(in)完全存入为止。

输出流相当于输入流的反过程:

首先我们要考虑一下你要输出的是什么?你要把输出的东西保存到哪里?

我这里要输出的是a.java文件,我要把它存在当前目录的b.java中

(注意:在这里是可以更换文件名的)

OutputStream out=new FileOutputStream("d:\\b.java");

这里的out对象是一个null,里面什么都没有,我们通过这个out对象来构造BufferedOutputStream

BufferedOutputStream bout=new BufferedOutputStream(out);

int len;

byte[] buf = new byte[1024];

注意:下面的句子比较长,要耐心看完哦!

通俗的讲:

    定义一个变量len,用来接收每次从缓冲区读取的8k数据中的你自定义数组的长度的数据,如果这8k的数据你读完了,会自动获取缓冲区中的第二份8k的数据继续读,直到读完为止。(当然,如果你的这个数据本身就不足8k,就只从缓冲区中取出一次,然后将这一次读取的数据按照你自定义的数组的长度分为若干份(这里说的若干份不严谨,其实就是8k/(数组长度)+1),交给变量len)将按照你自定义数组的长度读出来的数据一份一份的写入到bout这个缓冲区中,每8k往b.java文件中写一次,直到写完为止。

根据源代码解释就是:

    在你每次通过它的read(byte[] ,int,int)来操作输入流时,是从它内部的buf[] 数组中来读取数据,当buf[]中的数据被读取没的时候,它还会去调用fill()来填充这个buf[]数组

while( (len = bin.read(buf, 0, buf.length)) != -1){

bout.write(buf, 0, len);

}

代码如下:

import java.io.*;

public class Test_01 {

public static void main(String[] args) {

try {

InputStream in=new FileInputStream("d:\\a.java");

BufferedInputStream bin=new BufferedInputStream(in);

OutputStream out=new FileOutputStream("d:\\b.java");

 BufferedOutputStream bout=new BufferedOutputStream(out);

int len;

byte[] buf = new byte[1024];

while( (len = bin.read(buf, 0, buf.length)) != -1){

bout.write(buf, 0, len);

}

bout.close();

out.close();

bin.close();

in.close();

} catch (Exception e) {

e.printStackTrace();

}

}

其实Java自身不能写入数据,而是调用系统内部方式完成数据的书写,所以使用系统资源后一定要关闭资源。(昨天一同学跟我说他的电脑关机突然变慢了,后来想想就是因为他的程序在结尾处没有关闭资源)

 

   先谈到这里,若有不足之处,以后会慢慢弥补,读者若有更好建议,请多多指教。

 

 

 

0 0
原创粉丝点击