20145213《Java程序设计学习笔记》第六周学习总结
说在前面的话
上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知。在这里我还要自我批评一下,其实我事后没有及时反省,补充数据结构知识,抓紧时间掌握第九章内容,反其道而行现在要在没掌握第九章的情况下写自习第十章、第十一章的内容,简直误人子弟,一派胡言。我认罪,我有错。我深知即使点头如捣蒜,诚惶诚恐也于事无补,拿出干货才是硬道理。我会在下周二之前拿出对第九章内容理解博客。在写本周博客之前我拜访了一些数据结构学的好的同学博客,却并没有找到本周第一个吃螃蟹的人,于是饶有兴趣地看看了他们上周的学习总结,却猝不及防,灵魂深处的震撼无声无息而至。真的,我觉得有些同学学习态度真是让我望其项背,甚至望尘莫及。他们读透教材,在构建自己所理解的Java世界后,在博客中用自己的语言向读者描绘,哪怕辞藻不艳,也是隽永留芳。反观之我是生硬地搬运教材作者的话,借他人之酒杯,凑凑篇幅,实在可恨。影响更深刻的是蔡野同学在博客中表现了自己发现问题,一步步解决问题,最后把自己在过程中学到的经验与读者分享,我觉得这种钻研的劲头是难能可贵的。反求诸己,自己在碰到英文报错的情况下,大部分是寻求同学解决,剩下的是弃之不管。曾以为大家在Java自习路上,都是瘸脚的铁拐李,需要相互帮忙,相互搀扶,相互学习。现在想想,有些人认真的学习态度就可以自成最趁手的铁拐,有些人在学习上的敷衍了事确是自废一腿。情到深处泪空流,说了这么多,其实就是内心受到巨大震撼,暗流涌动,复杂的情绪源源不断从笔尖流淌而出,只有一个想到啥写啥的主线程,跳过了组织语言的线程,倒也是花了不多时间。废话不多说,开始正文吧。
教材学习内容总结
本周学习任务是第十章,第十一章的内容。即输入、输出与线程、并行API。
- 串流
- 数据有来源和目的地,衔接两者的是串流对象。将数据从来源去除,可以使用输入串流,将数据写入目的地,可以使用输出串流。专门提供输入水管的公司叫
java.io,InputStream
同样,专门提供输出水管的公司叫java.io.OutputStream
- 无论数据源或者目的地为何,只要设法取得
InputStream
和OutputStream
的实例,接下来操作输入与输出的方式是一致的,无需理会来源或者目的地的真正形式 - 在不使用
InputStream
和OutputStream
时,必须使用close
方法关闭串流。InputStream
和OutputStream
都操作java.io.Closeable
接口,其父接口为java.lang.AutoCloseable
接口 -
InputStream
有read()
方法,每次回尝试读入byte
数组长度的数据,并返回实际读入的字节。 -
OutputStream
有write()
方法,指定要写出的byte
数组、初始索引、数据长度。
- 串流继承架构
- 串流继承架构简单来说,就是介绍
InputStream
和OutputStream
总公司旗下的几个子公司,闻道有先后,术业有专攻之,具体想用什么水管,就要到具体指公司里去继承。 -
System.in
和System.out
表示标准输入与标准输出。如果使用java.util.Scanner
打包System.in
,你操作Scanner
的相关方法,而Scanner
会代你操控System.in
取得的数据,并转化为取得你想要的数据类型。 - 可以使用
System
的setIn()
方法指定InputStream
实例,重新指定标准输入来源。 -
FileInputStream
是InputStream
的实例,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来读取数据。FileOutputStream
是OutputStream
的实例,可以指定文件名创建实例,一旦创建文档开启,接着就可以用来写出数据。不用时,都要使用close()
关闭文档. -
ByteArrayInputStream
是InputStream
的实例,可以指定byte
数组创建实例,一旦创建就可以将byte
数组当做数据源进行读取。ByteArrayOutputStream
是OutputStream
的实例,可以指定byte
数组创建实例,一旦创建就可以将byte
数组当做目的地进行读取。
- 串流处理装饰器
-
InputStream
和OutputStream
提供串流基本操作,如果想为输入输出的数据加工处理,则可以使用打包器类,常用打包器类有具备缓冲区作用的BufferedInputStream
,BufferedOutputStream
具备数据转换处理作用的DataInputStream
,DataOutputStream
具备对象串行化能力的ObjectInputStream
,``` ObjectOutputStream ````
- 字符处理类
- 针对字符数据的读取,JavaSE提供了
java.io.Reader
类,其抽象化了字符数据读入的来源。针对字符数据的写入,则提供了java.io.Writer
类,其抽象化了数据写出的目的地。 -
FileReader
与FileWriter
则可以对文档做读取与写入,读取或写入时默认会使用操作系统默认编码来做字符转换。在启动JVM时,可以指定-Dfile.encoding
来制定FileReader
与FileWriter
所使用的编码。 -
Reader
与Writer
也有一些装饰器类可供使用。如果串流处理的字节数据,实际上代表某些字符的编码数据,而你想要将这些一些字节数据转换为对应的编码字符,可以使用InputStreamReader
与OutputStreamWriter
对串流数据打包。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 |