20155226 2016-2017-2 《Java程序设计》第6周学习总结

教材学习内容总结

第十章 输入/输出

10.1 InputStream与OutputStream

1 、 串流设计的概念

  • Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。
  • 从应用程序角度来看,如果要将数据从来源取出,可以使用输入串流,如果要将数据写入目的地,可以使用输出串流。在Java中,输入串流代表对象为java.io.Inputstream实例,输出串流代表对象为java.io.OutputStream实例。
  • 在不使用InputStreamutputStream时,必须使用close()方法关闭串流。由于InputStream与OutputStrem操作了java.io.Closeable接口,其父接口为java.lang.AutoCloseable接口。

2、串流继承架构

(1)标准输入/输出

  • System.inSystem.out查看API文件的话,会发现它们分别是InputStreamPrintStream的实例,分别代表标准输入与标准输出。
  • 可以使用System的setIn()方法指定InputStream实例,重新指定标准输入来源。标准输出可以重新导向至文档,只要执行程序时使用>将输出结果导向至指定文档。可以使用System的setOut()方法指定printStream实例,将结果输出至指定的目的地。

(2)FileInputStream与FileOutputStream

  • FileInputStreamInputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可用来读取数据。FileOutputStream是OutputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来写出数据。无论FileInputStream还是FileOutputStream,不使用时都要使用close()关闭文档。
  • FileInputStream主要操作了InputStream的read()操作方法,使之可以从文档中读取数据,FileOutputStream主要操作了OutputStream的write()操作方法,使之可以写出数据至文档。

(3)ByteArryInputStream与ByteArryOutputStream

  • ByteArryInputStreamInputStrteam的子类,可以指定byte数组创建实例,一旦创建就可将byte数组当做数据源进行读取。ByteArryOutputStream是OutputStream的子类,可以指定byte数组创建实例,一旦创建将byte数组当做目的地写出数据。
  • ByteArryInputStream主要操作了InputStream的read()操作方法,使之可以从byte数组中读取数据,ByteArryOutputStream主要操作了OutputStream的write()操作方法,使之可以写出数据至byte数组。

3、串流处理装饰器

  • InputStream、OutStream提供串流基本操作,如果想要为输入/输出的数据做加工处理,则可以使用打包器类。常用的打包器具备缓冲区作用的BufferedOutputStream、BufferedInputStream,具备数据转换处理的DataInputStream、DataOutputStream,具备对象串行化能力的ObjectInputStream、ObjectOutputStream等。

(1)BufferedInputStream与BufferedOutputStream

  • BufferedInputStreamBufferedOutputStream主要在内部提供缓冲区功能,操作上与InputStream、OutputStream并没有太大区别。

(2)DataInputStream与DataOutputStream

  • DataInputStream、DataOutputStream用来装饰InputStream、OutputStream,DataInputStream、DataOutputStream,提供读取、写入Java基本数据类型的方法,像是读写int、double、boolean等的方法。

第十一章 线程与并行API

11.1 线程

1.线程简介

  • 有时候需要设计程序可以拥有多个流程,也就是所谓的多线程程序。

2.Thread与Runnable

  • 从抽象观点来看,JVM是台虚拟计算机,只安装一颗称为主线程的CPU,可执行main()定义的执行流程。如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的start()方法,额外CPU执行流程的进入点,可以定义在Runnale接口的run()方法中。
  • .线程生命周期

4.关于ThreadGroup

  • 可以使用以下程序片段取得目前线程所属线程群组名:Thread.currentThread().getThreadGroup().getName()。ThreadGroup的某些方法,可以对群组中所有线程产生作用,例如interrupt()方法可以中断群组中所有线程,setMaxPriority()方法可以设定群组中所有线程最大优先权,activeCount()方法获取群组的线程数量 ,enumerate()方法要传入Thread数组,这会将线程对象设定至每个数组索引。

5.synchronizedvolatile

  • 使用synchronized:每个对象都会有个内部锁定,或称为监控锁定。被标示为synchronized的区块将会被监控,任何线程要执行synchronize区块都必须先取得指定的对象锁定。java的synchronize提供的是可重入同步,也就是线程取得某对象锁定后,若执行过程总又要执行synchronize,尝试取得锁定的对象来源又是同一个,则可以直接执行。
  • 使用volatile:synchronized要求达到的所标示区域的互斥性和可见性。互斥性是指synchronized区块同时间只能有一个线程;可见性是指线程离开synchronized区块后,另一线程接触到的就是上一线程改变后的对象状态。可以在变量上声明volatile,标示变量是不稳定、易变的,也就是可能在多线程下存取,这保证变量的可见性,也就是若有线程变动了变量值,另一线程一定可看到变更。被标示为volatile的变量,不允许线程快取,变量值的存取一定是在共享内存中进行。

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

看了蓝墨云班课上的视频,感觉理解得比较透彻,没有什么大问题。

代码托管

java inputstream 不关会造成内存泄露吗 inputstream不关闭会怎样_java

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):
  • 不使用Markdown不加分
  • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
  • 排版混乱的不加分
  1. 模板中的要素齐全(加1分)
  • 缺少“教材学习中的问题和解决过程”的不加分
  • 缺少“代码调试中的问题和解决过程”的不加分
  • 代码托管不能打开的不加分
  • 缺少“结对及互评”的不能打开的不加分
  • 缺少“上周考试错题总结”的不能加分
  • 缺少“进度条”的不能加分
  • 缺少“参考资料”的不能加分
  1. 教材学习中的问题和解决过程, 一个问题加1分
  2. 代码调试中的问题和解决过程, 一个问题加1分
  3. 本周有效代码超过300分行的(加2分)
  • 一周提交次数少于20次的不加分
  1. 其他加分:
  • 周五前发博客的加1分
  • 感想,体会不假大空的加1分
  • 排版精美的加一分
  • 进度条中记录学习时间与改进情况的加1分
  • 有动手写新代码的加1分
  • 课后选择题有验证的加1分
  • 代码Commit Message规范的加1分
  • 错题学习深入的加1分
  • 点评认真,能指出博客和代码中的问题的加1分
  • 结对学习情况真实可信的加1分
  1. 扣分:
  • 有抄袭的扣至0分
  • 代码作弊的扣至0分
  • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:
  • 排版整齐
  • 思考很深
  • 基于评分标准,我给本博客打分:10分。得分情况如下
  • 参考示例

其他(感悟、思考等,可选)

  • 学习java已经六个星期了,这周学习了java第十章第十一章的内容。随着教材内容的推进,内容越来越难懂了。这周我在前面几天敲出了代码,把那些例子都运行实践了一遍,看了一遍教材。到了周末就只需要写博客了,这次周日花了一个下午的时间来写博客,但是还有其他课程的实验报告需要写。到现在为止,我还是只会跟着教材上的例子去敲代码、去实践,但要是让我自己敲代码做一个小项目我却是做不到的。这是我学习过程中很大的一个问题。我希望能通过自己的努力不依赖教材自己独立编写出一些小项目。继续加油吧。

学习进度条

代码行数(新增/累积)

博客量(新增/累积)

学习时间(新增/累积)

重要成长

目标

5000行

30篇

400

第一周

5/5

1/1

10/10

第二周

75/80

1/2

15/25

第三周

253/305

1/3

25/50

第四周

390/695

1/4

30/80

比较熟练语法

第五周

527/1222

1/5

25/105

了解了许多API架构

第六周

1266/2488

1/6

25/130

看了不少教学视频

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难,软件工程 估计方法

  • 计划学习时间:25小时
  • 实际学习时间:25小时

(有空多看看现代软件工程 课件 软件工程师能力自我评价表)

参考资料