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

教材学习内容总结

第10章 输入/输出

10.1 InputStreamOutputStream

10.1.1 串流设计概念
  • 数据从来源取出,使用输入串流,代表对象为java.io.InputStream实例,将数据写入目的地,使用输出串流,代表对象为java.io.OutputStream
  • InputStreamOutputStream可以用自动关闭资源语法关闭
  • InputStreamread()方法,每次会尝试读入byte数组长度的数据,并返回实际读入的字节
  • FileInputStreamInputStream的子类,用于衔接文档以读入数据,FileInputStream同理,指定文档来源与写出目的地可用于将文档读入并另存为另一个文档
  • 从HTTP服务器读取某个网页,并另存为文档,使用java.net.URL,指定网址,URL实例会自动进行HTTP协议,使用openStream()方法取得InputStream实例

    10.1.2 串流继承架构
  • 标准输入/输出
    • System.inSystem.out分别是InputStreamOutputStream的实例
    • 可以使用SystemsetIn()方法指定InputStream实例,重新指定标准输入来源
    • 标准输出可以重新导向至文档,只要执行程序时使用 > 将结果导向至指定的文档,使用 >> 则是附加信息
    • 可以使用SystemsetOut()方法指定PrintStream实例,将结果输出至指定的目的地
    • System.setErr()PrintSteam实例,用来显示错误信息,输出的信息一定会显示在文本模式中,也可以使用System.setErr()指定PrintStream重新指定标准错误输出串流
  • FileInputStreamFileOutputStream
    • FileInputStreamInputStream的子类,可以指定文件名创建实例,一旦创建文档就开启可以读取数据
    • 同理,FileOutputStreamOutputStream的子类,指定文件名来创建实例,一旦创建文档就开启,接着就可以用来写出数据,不用时都要用close()关闭文档
    • 在读取、写入文档时,以字节为单位
  • ByteArrayInputStreamByteArrayOutStream
    • ByteArrayInputStreamInputStream的子类,可以指定byte数组创建实例,一旦创建就将byte数组当作数据源进行读取,同理,ByteArrayOutputStreambyte数组当作目的地写出数据

      10.1.3 串流处理装饰器
  • 为输入/输出的数据做处理,可以使用打包器类
  • 装饰器:这些类并没有改变InputStreamOutputStream行为,只不过在取得数据或者要输出时做一些处理
  • BufferedInputStreamBufferedOutputStream
    • 提供缓冲区功能,主要在内部提供缓冲区功能,操作上与InputStreamOutputStream没有太大区别
    • 创建BufferedInputStreamBufferedOutputStream必须提供InputStreamOutputStream进行打包,可以使用默认或自定义缓冲区大小
  • DataInptStreamDataOutputStream
    • 提供读入、写入Java基本数据类型的方法,会自动在指定的类型与字节间转换
    • 根据不同的类型使用writexxx()readxxx()方法
  • ObjectInputStreamobjectOutputStream
    • 将内存中的对象整个存储下来,之后再读入还原为对象
    • ObjectInputStream提供readObject()方法将数据读入对象,objectOutputStream提供writeObject()方法将对象写至目的地,可以被这两个方法操作的对象,必须操作java.io.Serializable接口(无定义方法接口,作标示之用,表示对象可串化)

      10.2 字符处理类

      10.2.1 ReaderWriter继承架构
  • java.io.Reader类和java.io.Writer类分别抽象化了字符数据读入的来源和写出的目的地
  • 可以使用尝试自动关闭资源语法
  • FileReader是一种Reader,主要用于读取文档并将读到的数据转换成字符,StringWriter是一种Writer可以将数据写至StringWriter,使用toString()方法取得字符串,代表所有写入的字符数据

    10.2.2 字符处理装饰器
  • InputStreamReaderOutputStreamWriter
    • 将字节数据转换为对应的编码字符,使用InputStreamReaderOutputStreamWriter对串流数据打包
    • 可以指定编码,没有指定编码就用默认编码做字符转换
  • BufferedReaderBufferredWriter
    • ReaderWriter提供缓冲区作用
    • readLine()方法,可以读取一行数据并以字符串返回(不包括换行字符)
  • System.inInputStream实例,可以指定给InputStreamReader创建之用,InputStreamReader是一种Reader,可指定给BufferedReader创建之用
  • InputStreamReaderSystem.in读入的字节数据做编码转换,BufferedReader将编码转换后的数据做缓冲处理
  • printWriter
    • PrintWriterPrintStream使用上类似,除了可以对OutputStream打包之外,还可以对Writer进行打包,提供prinnt()println()format()等方法

      第11章 线程与并行API

      11.1 线程

      11.1.1 线程简介
  • 如果想在main()以外独立建立流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run()方法中
  • main()开始的流程会由主线程执行,创建Thread实例来执行runnable实例定义的run()方法
  • 启动线程执行指定流程,必须要调用Thread实例的start()

    11.1.2 ThreadRunnable
  • 撰写多线程的程序的方式
    • 将流程定义在Runnablerun()方法中
    • 继承Thread类,重新定义ru()方法
  • 操作Runnable接口有弹性,还有机会继承别的类
  • 继承了Thread类,通常为了直接利用Thread中定义的一些方法

    11.1.3 线程生命周期
  • Daemon线程
    • 一个Thread被标示为Daemon线程,在所有非Daemon线程都结束时,JVM自动终止
    • 使用setDaemon()方法来设定一个线程是否为Deamon线程
    • 使用isDaemon()方法判断线程是否为Deamon线程
    • 默认所有从Deamon线程产生的线程也是Deamon线程
  • Thread基本状态图
    • 使用Threadsetpriority()方法设定优先权,1-10(Thread MIN_PRIORITY-Thread MAX_PRIORITY),默认值是5(Thread NORM_PRIORITY
    • 让线程进入Blocked状态,调用Thread.sleep()等方法,等待输入/输出
    • 线程因输入/输出进入Blocked状态,在完成输入/输出后,会回到runnable状态
    • 进入Blocked状态的线程,可以由另一个线程调用该线程的interrupt()方法,让他离开Blocked状态
  • 安插线程
    • join()将线程加入另一线程的流程中
  • 停止线程
    • 线程完成run()方法后,会进入Dead,进入Dead的线程不可以再次调用start()方法
    • 停止线程最好自行操作,让线程跑完应有的流程

      11.1.4 关于ThreadGroup
  • 线程一旦归入某个群组,就无法更换
  • java.lang.ThreadGroup可以管理群组中的线程
    • interrupt()方法可以中断群组中的所有线程
    • setMaxpriority()方法可以设定群组中所有线程最大优先权
    • enumerate()方法可以一次取得群组中所有线程
    • activeCount()方法取得群组的线程数量
    • uncaughtException()方法处理某个线程未被捕捉的异常

      11.1.5 synchronizedvolatile
  • 使用synchronized
    • 被标示为synchronized的区块将会被监控,任何线程要执行该区块必须先取得指定的对象锁定
    • 线程尝试执行synchronized区块而进入Blocked,在取得锁定之后,会先回到Runnable状态,等待排入Runnning状态
    • 死结:有些资源在多线程下彼此交叉取用
  • 使用volatile
    • synchronized要求达到的所标示区块的互斥性(synchronized区块同时间只能有一个线程)与可见性(线程离开synchronized区块后,另一线程接触到的就是上一线程改变后的对象状态)
    • 使用volatile达到变量范围
    • 在变量上声明volatile,表示变量是不稳定、易变的,可能在多线程下存取,保证变量的可见性

      11.1.6 等待与通知
  • 调用锁定对象的wait()方法,线程释放对象锁定,进入对象等待集合处于阻断状态(不参与CPU排班),其他线程竞争对象锁定执行synchronized范围的程序代码
  • wait()可以指定等待时间,时间到之后线程自动加入排班,指定时间为0或不指定,线程会继续等待,直到被中断
  • 调用notify(),会从对象等待集合中随机通知一个线程加入排班,被通知的线程会与其他线程共同竞争对象锁定
  • 调用notifyAll()会通知等待集合中的线程全部参加排班,这些线程会与其他线程共同竞争对象锁定

    11.2 并行API

    11.2.1 LockReadWriteLockCondition
  • 使用Lock
    • Lock接口主要操作类之一为ReentranLock,可以达到synchronized的作用,也提供额外的功能
    • 锁定Lock对象,调用其lock()方法,解除锁定,调用unlock()方法
    • trylock()方法,取得锁定返回true,没取得锁定返回false
  • 使用ReadWriteLock
    • ReadWriteLock接口定义了读取锁定与写入锁定的行为,ReentrantReadWriteLockReadWriteLock接口的主要操作类
  • 使用StampedeLock
    • ReadWriteLock在没有任何读取或写入锁定时,才可以取得写入锁定,可用于悲观读取
    • StampeedLock支持乐观读取操作
  • 使用Condition
    • Condition接口用来搭配Lock,最基本用法就是达到Objectwait()notify()notifyAll()方法的作用
    • 调用LocknewCondition()取得Condition操作对象
    • 调用Lockawait()将会使线程进入Condition的等待集合
    • 调用signal()方法通知等待集合中的一个线程,signalAll()方法通知所有等待集合中的线程

      11.2.2 使用Executor
  • java.util.concurrent.Executor接口,将Runnable的制定与实际执行分离,定义了execute()方法
  • 使用ThreadPoolExecutor(线程池)
    • 定义在java.util.concurrent.ExecutorService,需要线程池的功能,可以使用其子类java.util.concurrent.ThreadPoolExecutor
    • ExecutorServiceshutdown()方法会指定执行的Runnable都完成后啊,将ExcutorService关闭,shutdownNow()方法可以立即关闭ExcutorService
  • 使用ScheduledThreadPoolExecutor
    • ScheduledExecutorServiceExecutorService子接口,进行工作排成,schedule()方法用来排定RunnableCallable实例延迟多久后执行一次,并返回Future子接口ScheduleFuture的实例,对于重复性的执行,可使用scheduleWithFixedDelay()scheduleAtfixedRate()方法
    • scheduleWithFixedDelay()可安排延迟多久首次执行Runnable,执行完会排定延迟多久再次执行,scheduleAtfixedRate()依据指定周期排定每次执行的时间,了两种方法上次排定的工作抛出异常,不会影响下次排程的进行
  • 使用ForkJoinPool
    • 继承Recursivetask,主要是将子任务的分解与求解过程撰写于compute()方法中

      11.2.3 并行Collection简介
  • CopyOnWriteArrayList操作了List接口,复制数组
  • CopyOnWriteArraySet 操作了Set接口,适用于很少写入数据,但是迭代器频繁的情况
  • BlockingQueueQueue的子接口,新定义了put()take()等方法,调用put()方法,在队列已满的情况下会被阻断,调用take方法,在队列为空的情况下会被阻断
  • 使用BlockingQueue的操作ArrayBlockingQueue类,就不用处理wait()notify()等流程

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

  • 撰写单线程序、多线程程序的方式差别:操作Runnable接口的好处就是较有弹性,类还有机会继承其他类;若继承了Thread类,那该类就是一种Thread,通常是为了直接利用Thread中定义的一些方法,才会继承Thread来操作。

  • StringReader可以将字符串打包,当做读取来源,StringWriter可以作为写入目的地,最后toString()取得所有写入的字符组成的字符串。CharArrayReader、CharArrayWriter类似,将char数组当做读取来源以及写入目的地。

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

  • 存档IDEA程序时,再次打开无法运行,只能重新新建一个项目,因为打开时候默认的方式没有通过JDK

[代码托管]## [代码托管]

代码提交过程截图:

运行 git log --pretty=format:"%h - %an, %cd : %s" 并截图
代码量截图:

运行 find src -name "*.java" | xargs cat | grep -v ^$ | wc -l 并截图

  • CH06判断:可以用父类声明对象引用,用子类生成对象,但需要强制类型转换。(X)
  • CH06填空:写出编译P165 RPG.java的命令(javac –d . *.java)

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)
    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)
    • 一周提交次数少于20次的不加分
  6. 其他加分:
    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:
    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

错题

3. import java.util.*;
4. class ForInTest {
5.static List list=new ArrayList();
6.
7.public static void main (String [] args) {
8.list. add("a"); list. add("b");list. add( "c");
9. //insert code here

  1. System.out.print (o);
  2. }
    12. }
    哪一行插入到第9行将导致输出“abc"?
    A .
    for (Iterator o : list.iterator(); o.hasNext (); )

B .
for (Iterator o : list)

C .
for (Object o : list.iterator())

D .
for (Object o : list)

答案:D

下列哪些项是泛型的优点? (选两项)
A .
不用向下强制类型转换
B .
代码容易编写
C .
类型安全

D .
运行速度快

答案:AD

点评模板:

  • 博客中值得学习的或问题:

  • 代码中值得学习的或问题:
    • 问题:InputStream、Reader与Writer区别
      解决过程:Writer针对于字符数据写入,Reader针对于字符数据的读取,InputStream针对于串流输入
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:

基于评分标准,我给本博客打分:10分。得分情况如下:

  1. 正确使用Markdown语法(加1分):
  2. 模板中的要素齐全(加1分)
  3. 教材学习中的问题和解决过程, 加1分
  4. 代码调试中的问题和解决过程, 加1分
  5. 本周有效代码超过300分行,加2分
    6 其他加分 :
  • 进度条中记录学习时间与改进情况的加1分
  • 感想,体会不假大空的加1分
  • 代码Commit Message规范的加1分
  • 结对学习情况真实可信的加1分

  • 参考示例

点评过的同学博客和代码

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

Java学习笔记的学习已经进行了一半以上,这期间总是跟着书敲代码,看知识点也是一扫而过,现在应该将重点放在实践上,注重应用,才能真正将这门课学会

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 2/2 20/20
第二周 186/186 2/4 18/38
第三周 689/875 3/7 22/60
第四周 242/1117 2/9 30/90
第五周 698/1815 2/9 30/120
第六周 1269/3084 2/9 30/120

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

  • 计划学习时间:25小时

  • 实际学习时间:25小时

  • 改进情况:

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

参考资料

20155207王雪纯 2016-2017-2 《Java程序设计》第六周学习总结的更多相关文章

  1. 20155207王雪纯 2006-2007-2 《Java程序设计》第二周学习总结

    20155207王雪纯 2006-2007-2 <Java程序设计>第二周学习总结 教材学习内容总结 整数类型:short(占2字节).int()占4字节.long(占8字节) " ...

  2. 20155207 2016-2017-2 《Java程序设计》第九周学习总结

    20155207 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立 ...

  3. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  4. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  5. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  6. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  7. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  8. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  9. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  10. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

随机推荐

  1. unity纯粹物理驱动方式

    首先见官方文档 In most cases you should not modify the velocity directly, as this can result in unrealistic ...

  2. 团队作业Week5

    每个团队开一个讨论会,协商讨论团队贡献分的分配方式.每个团队的团队贡献分为50分/人.每个人分数不能相同,请详细说明分数的分配规则. 可参考这个博客. 截止时间:2014-10-27

  3. Daily Scrum NO.2

    工作概况 符美潇(PM) 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.为两名团队新成员制定了任务并录入TFS. 今日工作 1.Daily Scrum.日常会议及日 ...

  4. 基于RYU restful api实现的VLAN网络虚拟化

    基于RYU restful api实现的VLAN网络虚拟化 前言 本次实验是基于OVS的VLAN虚拟化简易实践方案的进一步的实验,采用RYU restful api进行配置.本质上和上次实验没什么差, ...

  5. CodeM Qualifying Match Q2

    问题描述: 组委会正在为美团点评CodeM大赛的决赛设计新赛制. 比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分. 比赛采取锦标赛赛制,分轮次进行, ...

  6. d3 选择器

    一.隔了一段时间没看D3了,好多api又陌生了.武林太大,唯有自强不息. D3 选择器算是学习D3的第一步吧. 跟 学习JQ一样.先熟悉下api,才能够如鱼得水,手到勤来. 二. 选择器 1.选择器 ...

  7. 小程序开发 绑定自定义数据data- 及JS获取

    1wxml<!-- 茶系显示隐藏函数sectionSelect --><view class="img-fur" data-id="{{item.id} ...

  8. Django-基本概念

    目录 Django 项目创建 项目结构 应用目录 Django Django是一个开放源代码的Web应用框架, 由Python写成. 采用了MVC的软件设计模式, 即模型M, 视图V和控制器C. 这套 ...

  9. [代码]--其他信息: ORA-01400: 无法将 NULL 插入

    这个错误其实就是oracle数据库的某列约束为 not null,但在插入值的时候插入了控制,无论是null和"",它都识别为空 有两种方法: 1.修改数据库字段约束为允许为空 2 ...

  10. github如何添加新的分支

    需求:甲建立分支分给乙步骤:在甲创建的项目仓库里边点右上角的按钮 就可以通过名字搜索了. 在乙的右上角 再选中Repositories就可以看到所有的 存储库 了