20155321 2016-2017-2 《Java程序设计》第六周学习总结
教材学习内容总结
第十章 IO 流
-
IO 流用来处理设备之间的数据传输
-
Java对数据的操作是通过流的方式
-
Java用于操作流的对象都在IO包中
-
流按操作数据分为字节流与字符流,按流向分为:输入流和输出流
-
抽象基类:字节流是InputStream和OutputStream,字符流是Reader和Writer
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀,前缀名是该流对象的功能
-
专门用于操作文件的Writer子类对象:FileWriter,使用FileWriter fw = new FileWriter("文件名")做了以下几件事:
1). 创建一个FileWriter对象,该对象一被初始化必须要明确被操作的文件
2). 该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖
3). 其实该步就是在明确数据要存放的目的地
配套的几个常用方法:
1). 调用write方法,将字符串写道流中
2). flush()方法刷新对象中的缓冲中的数据,将数据刷到目的地中
3). close()可关闭流资源,与flush()的区别是flush刷新后,流可继续使用,close刷新后会将流关闭
-
IO异常的处理方式
-
对已有文件的数据进行续写
-
读取文件的两种方式
1)方法1:创建一个文件读取流对象和指定名称的文件相关联。要保证该文件是已经存在的,否则会发生FileNotFoundException。read()方法用于读取流对象,特点是一次读一个字符而且会自动往下读
2)方法2:通过字符数组读取。定义一个字符数组,用于存储读到的字符。read(char[])返回的是读到字符的个数
总的来说,第十章可用以下这张图进行总结:
第十一章 多线程与并行API
-
多线程概述
1)进程:正在运行的程序,是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源
2)线程:是进程中的单个顺序控制流,是一条执行路径。一个进程如果只有一条执行路径,则称为单线程程序。。一个进程如果有多条执行路径,则称为多线程程序。
-
Java程序运行原理
Java命令会启动Java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个“主线程”,然后主线程去调用某个类的main方法。所以main方法运行在主线程中。在此之前的所有程序都是单线程的。
-
多线程的实现方案
1)继承Thread类
2)实现Runnable接口
注:实现接口方式好处是可以避免由于Java单继承带来的局限性。适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想。
-
线程的生命周期
-
线程安全问题的解决方案
1)方法1:同步代码块
- 同步的前提:
- 多个线程
- 多个线程使用的是同一个锁对象
-
同步的好处:同步的出现解决了多线程的安全问题。
-
同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
-
格式:synchronized(对象){需要同步的代码;}
此对象是如同锁的功能。
2)方法2:同步方法,即把同步关键字加到方法上
注意:如果锁对象是this,就可以考虑使用同步方法,否则能使用同步代码块的尽量使用同步代码块。
- 死锁问题
1) 同步弊端:
- 效率低
- 如果出现了同步嵌套,就容易产生死锁问题
2)死锁问题及其代码是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象同步代码块的嵌套案例
-
线程的状态转换图
-
线程组
-
概述:Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。
-
默认情况下,所有的线程都属于主线程组public final ThreadGroup getThreadGroup()。当然也能给线程设置分组
Thread(ThreadGroup group, Runnable target, String name)
-
-
线程池
JDK5新增了一个Executors工厂类来产生线程池,有以下3个方法:
1)public static ExecutorService newCachedThreadPool()
2)public static ExecutorService newFixedThreadPool(int nThreads)
3)public static ExecutorService newSingleThreadExecutor()
这3个方法的返回值是ExecutorService对象
-
匿名内部类方式使用多线程
1)new Thread(){代码…}.start();
2)new Thread(new Runnable(){代码…}).start();
教材学习中的问题和解决过程
-
问题1:装饰器类的主要作用是什么?真正编程的时候该如何运用?
解决方案:
1)BufferedInputStream与BufferedOutputStream: 内部提供缓冲,提高效率
2)DataInputStream与DataOutputStream:基本数据类型与字节的转换,
-
问题2:课本P331Download.java和Download2.java中有单线程和多线程的对比,如何看这两个程序的效率?
解决方案:暂时仍未得到解决
代码调试中的问题和解决过程
-
问题1:URL是什么意思,调试结果怎么看?
解决方案:尚未得到解决
代码托管
上周考试错题总结
-
问题1:输入"cd"命令并按回⻋车键后,将会出现什什么情况?
A.从当前目录切换到根目录
B.屏幕显示当前目录
C.从当前目录切换为上一级目录
-
[x] D.从当前目录切换到用户主目录
解决方案:cd 等价于cd ~,也就是cd /home/userXXX
-
问题2:(多选题)下列列哪些项是泛型的优点?(选两项):
-
[x] A.不用向下强制类型转换
B.代码容易易编写
-
[x] C.类型安全
D.运行速度快
解决方案:泛型是一个安全机制,与BD两项没什么关系
-
问题3:(单选题)List接口的特点是?
A.不允许重复元素,元素有顺序
B.不允许重复元素,元素无顺序
-
[x] C.允许重复元素,元素有顺序
D.允许重复元素,元素无顺序
Set接口的特点:不允许重复元素,元素无顺序
-
问题4:(单选题)CLASSPATH中的“.”的含义是哪项?
A.省略号
-
[x] B.当前目录
C.所有目录
D.上级目录
-
问题5:(单选题)假设有⾃自定义异常类ServiceException,那么抛出该异常的语句句正确的是?
A.raise ServiceException
-
[x] B.throw new ServiceException()
C.throw ServiceException
D.throws ServiceException
解决方案:抛出的一定是个对象,因此有()号,选B
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
-
博客中值得学习的或问题:
- xxx
- xxx
- ...
-
代码中值得学习的或问题:
- xxx
- xxx
- ...
-
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
点评过的同学博客和代码
- 本周结对学习情况
- 20155330
- 结对照片
- 结对学习内容
- 第十章 IO流
- 第十一章 多线程与并行API
- 上周博客互评情况
其他(感悟、思考等,可选)
本周的学习任务总体而言还是很重的,学习的内容和深度感觉比以往几个星期都加重了很多。在本周的学习中,书本上专业的描述以及代码中我总是遇到一些看不懂或者似是而非的知识,这迫使我不得不翻看之前的章节进行补漏,这花费了我很多的时间,也提醒了我学习的时候还是学得扎实些比较好,不然对后续的学习也会有不好的影响
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 1/ | 20/20 | 对IDEA、git、JDK、JVM有了更多的了解,面对学习过程中遇到的困难学会自己主动地寻找办法去解决 | |
第二周 | 1/2 | 18/38 | 掌握了Java中的基本运算符和基本语句 | |
第三周 | 1/3 | 22/60 | 对面向对象、封装、构造函数等重要知识点有了初步理解,学会自主学习,遇到困难的时候从多方面寻找资料以求答案 | |
第四周 | 1/4 | 22/60 | 对继承和多态了一定程度的理解,并学会使用多态来提高代码的复用性 | |
第五周 | 706/2639 | 1/5 | 25/85 | 对异常以及集合框架的学习 |
第六周 | 735/3194 | 1/6 | 28/113 | 对IO流,多线程以及并行API的学习 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:20小时
-
实际学习时间:28小时
-
改进情况:看书遇到的障碍较多,有些是之前学习的知识不踏实导致的,之后要注意这个问题
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)