Java缓冲区之输入输出流

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

 

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

 

 

 

相关推荐
<p> <span style="font-size:14px;color:#E53333;">限时福利1:</span><span style="font-size:14px;">购课进答疑群专享柳峰(刘运强)老师答疑服务</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;"></span> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>为什么需要掌握高性能的MySQL实战?</strong></span> </p> <p> <span><span style="font-size:14px;"><br /> </span></span> <span style="font-size:14px;">由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准一。</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了</span><span style="font-size:14px;">「高性能 MySQL 知识框架图」</span><span style="font-size:14px;">,帮你梳理学习重点,建议收藏!</span> </p> <p> <br /> </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006031401338860.png" /> </p> <p> <br /> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;">课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。</span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;"></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>一、性能优化篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>二、MySQL 8.0新特性篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>三、高性能架构篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>四、面试篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。</span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页