周学习笔记(一)

  前言:这学期开始真的感到紧迫感了,课程很多,时间又过得很快,想学习的知识也很多,于是给自己定下计划,每天一定要刷至少一两道LeetCode题目,每周要看完一章的java编程思想,以此强化对java的学习,再每周要抽出时间学习一下安卓的基本知识,任务不多,但是希望自己能坚持住,并在这里每周写下对java编程思想的笔记。因为前段时间完成课程作业刚好使用到io流,发现自己对io流仍然很是陌生,所以第一周选定的章节就是io流。

IO流:

  java I/O库使用流这个抽象概念,代表任何有能力长处数据的数据源对象或者有能力的接受端对象。“流”屏蔽了实际的I/O设备中处理数据的细节;

1.java I/O流使用装饰器模式对原有的流进行装饰,以此达到不同的功能目的,因此IO库中的类比较多,看完之后总会忘掉,所以我对部分类进行了整理,方便自己记忆,如下:

2.标准IO的

  (一)概念:程序中所使用的单一信息流;

  (二)标准IO重定向:setIn(),setOut()方法(注意重定向操作的是字节流而不是字符流,所以应该用Stream)

3.新I/O(nio)

  (一)新IO引进了通道(Channel)和缓冲器(Buffer)的概念,这样就不用每次读写操作就不用那么频繁切换到OS,以此提高IO的速度(使用缓存器Buffer

     存储字节进行缓存);

  (二)FileInputStream,FileOutputStream,RandomAccessFile均被修改,使得可以用方法getChannel()产生FileChannel类;而Reader和Writer则可以通过

        Channel类的方法在通道中产生Reader和Writer

  (三)视图缓冲器:底层仍然是ByteBuffer,但是可以让我们通过某个特定的基本数据类型的视窗查看其底层的ByteBuffer,如IntBuffer

  (四)内存映射文件:内存映射文件允许我们创建和修改哪些因为太大而不能放入内存的文件。有了内存映射文件,我们就可以假定整个文件都放在内存中

     ,而且可以完全把他当成非常大的数组来访问。内存映射文件的所有输出都必须使用RandomAccessFile,先获得通道,再调用map()产生

     MappedByteBuffer(继承自ByteBuffer)

     注意:内存映射的文件只有部分被放进了内存,文件的其它部分被交换了出去,用这种方式,很大的文件也可以很容易的修改

     原理:传统的文件IO:我们都是调用操作系统提供的底层标准IO系统调用函数 read()、write() ,此时调用此函数的进程(在JAVA中即java进 

        程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然 后再把数据从内核IO缓冲区拷贝到进

        程的私有地址空间中去,这样便完成了一次IO操作。这么做是为了减少磁盘的IO操作,为了提高性能而考虑的,因为我们的程序访问一般都带有

        局部性,也就是所 谓的局部性原理,在这里主要是指的空间局部性,即我们访问了文件的某一段数据,那么接下去很可能还会访问接下去的一段

        数据,由于磁盘IO操作的速度比直接 访问内存慢了好几个数量级,所以OS根据局部性原理会在一次 read()系统调用过程中预读更多的文件数据

        缓存在内核IO缓冲区中,当继续访问的文件数据在缓冲区中时便直接拷贝数据到进程私有空间,避免了再次的低 效率磁盘IO操作。

        

 

        nio:内存映射文件和之前说的 标准IO操作最大的不同之处就在于它虽然最终也是要从磁盘读取数据,但是它并不需要将数据读取到OS内核缓冲

        区,而是直接将进程的用户私有地址空间中的一 部分区域与文件对象建立起映射关系,就好像直接从内存中读、写文件一样,速度当然快了。

  

        参考文章连接:https://blog.csdn.net/Evankaka/article/details/48464013

 

4.对象序列化(基于字节):

  (一)要实现序列化必须实现Serilizable(没有任何抽象方法,直接实现即可,恢复的时候直接以它储存的二进制为基础来构造)

    如果需要保存static字段则需要自己实现serializeStaticState(ObjectOutputStream os)和deseriializeStaticState()方法,才能保存;

  (二)Externalizable继承了Serilizable接口,有同时增加了writeExternal()和readExternal()方法,这两个方法可以再序列化和反序列化中被调用,使用此接

     口所有的默认构造器都会被调用,而不在默认初始化构造器 的变量则需要我们在以上两个方法进行保存和读取。

 

  由于时间问题,没办法写得很详细,但大概写一下应该可以帮助自己加深一下印象,因为上机的次数实在太少,看完很快就会忘记,等学一段时间后尽量找一个完整的项目,练习一下所学的知识,以上是通过看书,还有网上找资料,加上自己的理解写成的,由于本人水平非常非常有限,如果错误,望帮忙指正。

  

 

posted @ 2020-04-01 20:37  hzh003  阅读(131)  评论(1编辑  收藏  举报