20145213《Java程序设计学习笔记》第六周学习总结

20145213《Java程序设计学习笔记》第六周学习总结


说在前面的话

上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知。在这里我还要自我批评一下,其实我事后没有及时反省,补充数据结构知识,抓紧时间掌握第九章内容,反其道而行现在要在没掌握第九章的情况下写自习第十章、第十一章的内容,简直误人子弟,一派胡言。我认罪,我有错。我深知即使点头如捣蒜,诚惶诚恐也于事无补,拿出干货才是硬道理。我会在下周二之前拿出对第九章内容理解博客。在写本周博客之前我拜访了一些数据结构学的好的同学博客,却并没有找到本周第一个吃螃蟹的人,于是饶有兴趣地看看了他们上周的学习总结,却猝不及防,灵魂深处的震撼无声无息而至。真的,我觉得有些同学学习态度真是让我望其项背,甚至望尘莫及。他们读透教材,在构建自己所理解的Java世界后,在博客中用自己的语言向读者描绘,哪怕辞藻不艳,也是隽永留芳。反观之我是生硬地搬运教材作者的话,借他人之酒杯,凑凑篇幅,实在可恨。影响更深刻的是蔡野同学在博客中表现了自己发现问题,一步步解决问题,最后把自己在过程中学到的经验与读者分享,我觉得这种钻研的劲头是难能可贵的。反求诸己,自己在碰到英文报错的情况下,大部分是寻求同学解决,剩下的是弃之不管。曾以为大家在Java自习路上,都是瘸脚的铁拐李,需要相互帮忙,相互搀扶,相互学习。现在想想,有些人认真的学习态度就可以自成最趁手的铁拐,有些人在学习上的敷衍了事确是自废一腿。情到深处泪空流,说了这么多,其实就是内心受到巨大震撼,暗流涌动,复杂的情绪源源不断从笔尖流淌而出,只有一个想到啥写啥的主线程,跳过了组织语言的线程,倒也是花了不多时间。废话不多说,开始正文吧。


教材学习内容总结

本周学习任务是第十章,第十一章的内容。即输入、输出与线程、并行API。

  1. 串流
  • 数据有来源和目的地,衔接两者的是串流对象。将数据从来源去除,可以使用输入串流,将数据写入目的地,可以使用输出串流。专门提供输入水管的公司叫java.io,InputStream同样,专门提供输出水管的公司叫java.io.OutputStream
  • 无论数据源或者目的地为何,只要设法取得InputStreamOutputStream的实例,接下来操作输入与输出的方式是一致的,无需理会来源或者目的地的真正形式
  • 在不使用InputStreamOutputStream时,必须使用close方法关闭串流。InputStreamOutputStream都操作java.io.Closeable接口,其父接口为java.lang.AutoCloseable接口
  • InputStreamread()方法,每次回尝试读入byte数组长度的数据,并返回实际读入的字节。
  • OutputStreamwrite()方法,指定要写出的byte数组、初始索引、数据长度。
  1. 串流继承架构
  • 串流继承架构简单来说,就是介绍InputStreamOutputStream总公司旗下的几个子公司,闻道有先后,术业有专攻之,具体想用什么水管,就要到具体指公司里去继承。
  • System.inSystem.out表示标准输入与标准输出。如果使用java.util.Scanner打包System.in,你操作Scanner的相关方法,而Scanner会代你操控System.in取得的数据,并转化为取得你想要的数据类型。
  • 可以使用SystemsetIn()方法指定InputStream实例,重新指定标准输入来源。
  • FileInputStreamInputStream的实例,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来读取数据。 FileOutputStreamOutputStream的实例,可以指定文件名创建实例,一旦创建文档开启,接着就可以用来写出数据。不用时,都要使用close()关闭文档.
  • ByteArrayInputStreamInputStream的实例,可以指定byte数组创建实例,一旦创建就可以将byte数组当做数据源进行读取。 ByteArrayOutputStreamOutputStream的实例,可以指定byte数组创建实例,一旦创建就可以将byte数组当做目的地进行读取。
  1. 串流处理装饰器
  • InputStreamOutputStream提供串流基本操作,如果想为输入输出的数据加工处理,则可以使用打包器类,常用打包器类有具备缓冲区作用的BufferedInputStream,BufferedOutputStream具备数据转换处理作用的DataInputStream,DataOutputStream具备对象串行化能力的ObjectInputStream,``` ObjectOutputStream ````
  1. 字符处理类
  • 针对字符数据的读取,JavaSE提供了java.io.Reader类,其抽象化了字符数据读入的来源。针对字符数据的写入,则提供了java.io.Writer类,其抽象化了数据写出的目的地。
  • FileReaderFileWriter则可以对文档做读取与写入,读取或写入时默认会使用操作系统默认编码来做字符转换。在启动JVM时,可以指定-Dfile.encoding来制定FileReaderFileWriter所使用的编码。
  • ReaderWriter也有一些装饰器类可供使用。如果串流处理的字节数据,实际上代表某些字符的编码数据,而你想要将这些一些字节数据转换为对应的编码字符,可以使用InputStreamReaderOutputStreamWriter对串流数据打包。BufferedInputStream,BufferedOutputStream对串流数据打包

教材学习中的问题和解决过程

又是这个模块了,每次都会有种“少年不识愁滋味,为赋新词强说愁”的感觉。其实我的自习过程就是古井无波的。然而在自习过程中没有问题产生,博客写到这里又没有问题可以在这里提出,我有隐隐觉得这是一个很大的问题。这是不是暴露出我学习积极性不高,没有热情呢?一想到自己缺少其他同学钻研的劲头,我心里隐隐发慌。如果硬要说我在教材学习中碰到什么问题,那就是为什么我会比其他同学缺少发现问题的思考与热情。


代码调试中的问题和解决过程

一开始我求平均数的方法代码如下:

public void showAvg() {
        double sum1 = 0;
        double sum2 = 0;
        double sum3 = 0;
        int number = 2;
                for (int i = 0; i < n.length; i++) {
                if (n[i] != null) {
                sum1 = n[i].Chinese + sum1;
                sum2 = n[i].English + sum2;
                sum3 = n[i].Math + sum3;
                continue;
            }
        System.out.println("Chinese的平均分:" + sum1 / i + "English的平均分:" + sum2 / i + "Math的平均分:" + sum3 / i);
        }
    }

执行结果如下

第一次求平均数是正确,但接下来竟不断进行求平均数,很明显没有在适宜的时机退出for循环语句,因此我做出以下代码改变:

public void showAvg() {
        double sum1 = 0;
        double sum2 = 0;
        double sum3 = 0;
        int number = 2;
                for (int i = 0; i < n.length; i++) {
                if (n[i] != null) {
                sum1 = n[i].Chinese + sum1;
                sum2 = n[i].English + sum2;
                sum3 = n[i].Math + sum3;
                continue;
            }
            else 
                break;
        }
            System.out.println("Chinese的平均分:" + sum1 / (i-1) + "English的平均分:" + sum2 / (i-1) + "Math的平均分:" + sum3 / (i-1));
        
   }

所以做出这样改变,我是想在n[i]读取到null的时候退出for循环,这个代码放在C语言中是没有问题的,但唉Java中却出现编译失败,显示未定义i。后来在咨询同学后才明白这个i我是放在for循环中定义的,在退出for循环后,i就定义失效了。因此,我又做出如下改变:

public void showAvg() {
        double sum1 = 0;
        double sum2 = 0;
        double sum3 = 0;
        int number = 0;
                for (int i = 0; i < n.length; i++) {
                number=i;
                if (n[i] != null) {
                sum1 = n[i].Chinese + sum1;
                sum2 = n[i].English + sum2;
                sum3 = n[i].Math + sum3;
                continue;
            } else
                break;
        }
        System.out.println("Chinese的平均分:" + sum1/number  + "English的平均分:" + sum2 /number + "Math的平均分:" + sum3 / number);
   }

其他

代码托管如下:








学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 20/20 1/1 10/10
第二周 200/220 1/2 15/25
第三周 200/420 1/3 15/40
第四周 200/620 1/4 15/55
第五周 100/720 1/5 10/65
第六周 200/920 1/6 15/80

参考资料

*Java学习笔记(第8版)
*《Java学习笔记(第8版)》学习指导

原文地址:https://www.cnblogs.com/qiwei/p/5374512.html