20145234黄斐《java程序设计》第六周
教材学习内容总结
第十章:输入与输出
InputStream与OutputStream
- 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而言的
- InputStream与OutputStream
- InputStream、OutStream提供串流基本操作,如果想要为输入/输出的数据做加工处理,则可以使用打包器类。常用的打包器具备缓冲区作用的BufferedOutputStream、BufferedInputStream,具备数据转换处理的DataInputStream、DataOutputStream,具备对象串行化能力的ObjectInputStream、ObjectOutputStream等。
- read
- 针对字符数据的读取,Java SE提供了java.io.Reader类,其抽象化了字符数据读入的来源。针对字符数据的写入,则提供了java.io.Writer类。其抽象化了数据写出的目的地。
- write
- FileReader、FileWriter则可以对文档做读取与写入,读取或写入时默认会使用操作系统默认编码来做字符转换。在启动JVM时,可以指定-Dfile.encoding来指定FileReader、FileWriter所使用的编码。
- 二进制文件
- 标准输入输出
- System.in: 标准输入,默认关联到键盘(终端输入)
- System.out: 标准输出,默认关联到显示器(终端输出)
- System.err: 标准错误,默认关联到显示器(终端输出)
- 输入输出重定向:setIn,setOut,setErr
- FileInputStream与FileOutPutStream
- FileInputStream是InputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可用来读取数据。FileOutputStream是OutputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来写出数据。无论FileInputStream还是FileOutputStream,不使用时都要使用close()关闭文档。
- 文件读写
- 装饰器类
- Decorator模式
- BufferedInputStream与BufferedOutputStream: 内部提供缓冲,提高效率
- DataInputStream与DataOutputStream:基本数据类型与字节的转换,API好好研究一下
- ObjectInputStream与ObjectOutputStream
- java.io.Serializable接口
字符处理类
- Reader与Writer
- Reader、Writer也有一些装饰器类可供使用。如果串流处理的字节数据,实际上代表某些字符的编码数据,而你想要将这些字节数据转换为对应的编码字符,可以使用InputStreamReader、OutputStreamWriter对串流数据打包。BufferedReader、BufferedWriter可对Reader、Writer提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。PrintReader、PrintStream使用上极为类似,不过除了可以对OutputStream打包之外,PrintWriter还可以对Writer进行打包,提供print()、println()、format()等方法。
- 字符处理装饰器
想要将这些字节数据转换为对应的编码字符,可以使用InputStreamReader、OutputStreamWriter对串流数据打包。
BufferedReader、BufferedWriter可对Reader、Writer提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。
PrintWriter还可以对Writer进行打包,提供print()、println()、format()等方法。
第十一章部分 - 线程与并行API
线程
- 线程
- 在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run()方法中。
在java中,从main()开始的流程会由主线程执行,可以创建Thread实例来执行Runnable实例定义的run()方法。 - Thread与Runnable
- JVM是台虚拟计算机,只安装一颗称为主线程的CPU,可执行main()定义的执行流程。如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的start()方法,额外CPU执行流程的进入点,可以定义在Runnale接口的run()方法中。
- 撰写多线程程序的方式:
- 将流程定义在Runnable的run()方法中
- 继承Thread类,重新定义run()方法
- 操作Runnable接口的好处就是较有弹性,你的类还有机会继承其他类。若继承了Thread,那该类就是一种Thread,通常是为了直接利用Thread中定义的一些方法,才会继承Thread来操作。
- 如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的start()方法,额外CPU执行流程的进入点,可以定义在Runnale接口的run()方法中。
- 线程生命周期
- Daemon线程:主线程会从main()方法开始执行,直到main()方法结束后停止JVM。如果主线程中启动了额外线程,默认会等待被启动的所有线程都执行完run()方法才中止JVM。如果一个Thread被标示为Daemon线程,在所有的非Daemon线程都结束时,JVM会自动终止。从main()方法开始的就是一个非Daemon线程,可以使用setDaemon()方法来设定一个线程是否为Daemon线程。还可以使用isDaemon()方法判断线程是否为Daemon线程。
- 线程控制的一些方法
- 接口定义行为
- interrupt
- sleep
- join
- stop(Deprecated)
- resume(Deprecated)
- suspend(Deprecated)
- destroy(Deprecated)
- 线程的停止、暂停、重启要程序员设定实现条件或使用并发API,不要调用Deprecated的方法
- 同步:synchronized与volatile
- wait、notify、notifyAll
- ThreadGroup
每个线程都属于某个线程群组,如果没有指定,则归入产生该子线程的线程群组,也可以自行指定线程群组,线程一旦归入某个群组,就无法再更换。ThreadGroup的某些方法,可以对群组中所有线程产生作用。如果想要一次取得群组中所有线程,可以使用enumerate()方法。activeCount()方法取得群组的线程数量。 未捕捉异常会由线程实例setUncaughtExceptionHandler()设定的Thread.UncaughtExceptionHandler实例处理之后是线程ThreadGroup,然后是默认的Thread.UncaughtExceptionHandler。
package cc.openhome;
public class TortoiseHareRace2{
public static void main(String[] args){
Tortoise tortoise = new Tortoise(10);
Hare hare = new Hare(10);
Thread tortoiseThread = new Thread(tortoise);
Thread hareThread = new Thread(hare);
tortoiseThread.start();
hareThread.start();
}
}
并行API
如果需要的是线程池、读写锁等高级操作。从JDK5之后提供了java.util.concurrent包,可基于其中的API建立更稳固的并行应用程序。java.util.concurrent.looks包中提供Lock、ReadWriter与Condition接口以及相关操作类,可以提供类似 synchronized、 wait()、notify()、notifyAll()的作用,以及更多高级功能。
- Lock:相对与Thread模型的隐式的锁对象,Lock提供了显式的锁操作从而简化应用程序。Executors:提供了一组HighLevelAPI用来执行和管理并行任务。 ConcurrentCollections(并行集合):包含了一组支持并行处理的数据结构,大大简化了并行编程难度。AtomicVariables(原子变量):减少了同步操作并且避免数据不一致。Fork/Join框架:提供了进程操作的支持。
- 相对与Thread模型的隐式的锁对象,Lock提供了显式的锁操作从而简化应用程序。Executors:提供了一组HighLevelAPI用来执行和管理并行任务。 ConcurrentCollections(并行集合):包含了一组支持并行处理的数据结构,大大简化了并行编程难度。AtomicVariables(原子变量):减少了同步操作并且避免数据不一致。Fork/Join框架:提供了进程操作的支持。
- ReadWriteLock:ReadWriteLock接口定义了读取锁定与写入锁定行为,可以使用readLock()、writeLock()方法返回Lock操作对象。ReentrantReadWriteLock是ReadWriteLock接口的主要操作类,readLock()方法会返回ReentrantReadWriteLock.ReadLock实例,writeLock()犯法会返回ReentrantReadWriteLock.WriteLock实例。
- Condition:Condition接口用来搭配Lock,最基本用法就是达到Object的wait()、notify()、notifyAll()方法的作用。Condition的await()、signal()、signalAll()方法,可视为Object的wait()、notify()、notifyAll()方法的对应。
- Executor:提供了一组HighLevelAPI用来执行和管理并行任务。
- ScheduledThreadPoolExecutor:ScheduledExecutorService为ExecutorService的子接口,顾名思义,可以让你进行工作排程:schedule()方法用来排定Runnable或Callable实例延迟多久后执行一次,并返回Future子接口ScheduledFuture的实例,对于重复性的执行,可使用scheduleWithFixedDelay()和scheduleAtFixedRate()方法。
- ForkJoinPool:所谓分而治之的问题,是指这些问题的解决,可以分解为性质相同的子问题,子问题还可以再分解为更小的子问题,将性质相同的子问题解决并收集运算结果,整体问题也就解决了。
ForkJoinPool与其他的ExecutorService操作不同的地方在于,它是闲聊了工作窃取演算,其建立的线程如果完成手边任务,会尝试寻找并执行其他任务建立的资额任务,让线程保持忙碌状态,有效利用处理器的能力。需要注意:ForkJoin框架适用于计算密集式的任务,较不适合用于容易造成线程阻断的场合。 - 并行Collection
- CopyOnWriteArrayList操作了List接口,这个类的实例在写入操作是,内部会建立新数组,并复制原有数组索引的参考,然后在新数组上进行写入操作,写入完成后,再将内部原参考旧数组的变量参考至新数组。
- CopyOnWriteArraySet操作了Set接口,与CopyOnWriteArrayList相似。
- BlockedQueue是Queue的子接口,新定义了put()、take()方法。
- ConcurrentMap是Map的子接口,其定义了putIfAbsent()、remove()、replace()等方法。这些方法都是原子操作。
- ConcurrentHashMap是ConcurrentMap的操作类,ConcurrentNavigableMap是ConcurrentMap的子接口,其操作类为ConcurrentSkipListMap,可视为支持并行操作的TreeMap版本。
教材学习中的问题与解决过程
问题1:InputStream
与Reader
差别OutputStream
与Writer
差别
InputStream和OutputStream类处理的是字节流,数据流中的最小单位是字节(8个bit)
Reader与Writer处理的是字符流,在处理字符流时涉及了字符编码的转换问
Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为其分配内存
Writer类能够将内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。
- 问题2:教材327页TortoiseHareRace2.java代码运行代码运行的时候先执行完乌龟走完10步,再执行兔子走完10步,而不是按乌龟和兔子每轮走的情况来执行的。
上周考试错题解析
虽然因为大部分人没有提交所以都是五分,但是我是提交的三个人中的一个,也知道了错题
1.输入"cd"命令并按回车键后,将会出现什么情况?A.从当前目录切换到根目录B.屏幕显示当前目录C.从当前目录切换为上一级目录D.从当前目录切换到用户主目录(D)
3.现有:
import java.util.*;
Class FindStuff {
public static void main (String[]args) {
//insert code here
c.put ("X", 123);
}
}
分别插入到第5行,哪几行允许代码编译?(BDF)
A . Map c= new SortedMap();
B . HashMap c= new HashMap();
C . HashMap c= new Hashtable();
D .SortedMap c= new TreeMap();
E .ArrayList c= new ArrayList();
F .Map c = new LinkedHashMap();
4.现有:
- list是一个合法的集合引用
- getCollection()返回一个合法集合的引用
哪个是合法的?(BE)
A . or(Object o ; list)
B . for(Object o : getCollection())
C . for(Object o : list.iterator())
D . for(lterator i ; list.iterator() ; i.hasNext () )
E . for(lterator i=list.iterator(); i.hasNext (); )
5.现有:
import java.util.*;
class ForInTest {
static List list=new ArrayList();
}
public static void main (String [] args) {
list. add("a"); list. add("b");list. add( "c");
//insert code here
System.out.print (o);
}
}
哪一行插入到第9行将导致输出“abc"?(D)
A .for (Iterator o : list.iterator(); o.hasNext (); )
B .for (Iterator o : list)
C .for (Object o : list.iterator())
D . for (Object o : list)
7.创建一个只能存放String的泛型ArrayList的语句是哪项?(B)
A .ArrayList<int> al=new ArrayList<int>();
B . ArrayList<String> al=new ArrayList<String>()
C .ArrayList al=new ArrayList<String>();
D .ArrayList<String> al =new List<String>();
12.集合API 中Set接口的特点是?(D)
A .不允许重复元素,元素有顺序
B .允许重复元素,元素无顺序
C .允许重复元素,元素有顺序
D .不允许重复元素,元素无顺序
15.(D)
17.(C)
19.(AC)
20.(C)
21.(D)
24.(D)
29.(D)
代码托管
评分 8
- 教材学习中的问题和解决过程, 一个问题加1分
- 本周有效代码超过300分行的(加2分)
- -排版精美的加一分
- -进度条中记录学习时间与改进情况的加1分
- -错题学习深入的加1分
互评
基于评分标准,我给俞昆的博客打分:3分。得分情况如下:
正确使用Markdown语法:+1
模板中的要素基本齐全:+1
代码Commit Message规范的:+1
学习进度条
20145234黄斐《java程序设计》第六周的更多相关文章
- 20145234黄斐《信息安全系统设计基础》第六周学习总结(Y86模拟器的安装)
Y86模拟器的安装 由于本人的电脑有些问题,在安装的时候忽然断电导致之前的成果都没有截图. 1.安装bison和flex词法分析工具 sudo apt-get install bison flex t ...
- 20145234黄斐《信息安全系统设计基础》第七周(Linux命令复习)
已经到了11月,学期过半,而<信息安全系统设计基础>这门课也要到了期中考试了.所以,我在这里,对前半个学期的最基础的知识,做一个复习 复习计划分为两步,本次为Linux命令,下次计划复习g ...
- 20155334 2016-2017-2 《Java程序设计》第九周学习总结
20155334 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章:整合数据库 16.1 JDBC入门 JDBC(Java DataBase Conn ...
- 20155321 2016-2017-2 《Java程序设计》第九周学习总结
20155321 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 厂商在实现JDBC驱动程序时,依方式可将驱动程序分为四种类型: JDBC-OD ...
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
- 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结
20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...
- 20155303 2016-2017-2 《Java程序设计》第二周学习总结
20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...
随机推荐
- 富文本编辑器-UEditor
官方网址:http://ueditor.baidu.com/website/index.html 下载地址:http://ueditor.baidu.com/website/download.html ...
- Java含有Date的对象序列化网络传输
与短信接口对接时,Date从我这边传输以及在短信平台接收后转换出了问题 传入一个TemplateRequest对象 Feign接口 将含有Date的将要传输的TemplateRequest加上@Req ...
- win10下关于apache配置虚拟主机
apache安装完默认是不开启虚拟服务器的,如果希望在本地apache上面配置虚拟服务器,类似于在网上买的虚拟主机,可以按照以下步骤进行配置: 1,修改本机的hosts文件,如下 示例:127.0.0 ...
- maven package install deploy
1.maven package:打包到本项目,一般是在项目target目录下. 如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目, ...
- springmvc DispatchServlet初始化九大加载策略(二)
4. initHandlerMappings 请求分发 HandlerMappings是一个List<HandlerMapping>类型数据,也就是说初始化可以存放多种Mapping,和其 ...
- css3自定义placeholder字体颜色
::-webkit-input-placeholder{color:#f00;} ::-moz-placeholder{color:#f00;} :-moz-placeholder{color:#f0 ...
- jQuery对象转换为DOM对象(转)
jQuery对象转换为dom对象 只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的 ...
- Ecshop模板目录介绍[xyytit]
一. 模板系统介绍 Ecshop模板系统使用我们自行研发的模板控制系统和著名的PHP开源模板程序Smarty组合而成.为了方便用户开发模板,还使用了Dreamweaver的模板和库的功能Smarty中 ...
- TZOJ 4435 n皇后问题(回溯)
描述 在 n×n 的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后(任两个皇后都不能处于同一条横行.纵行或斜线上) 输入 输入有多组(直到-1结束) 每组一行 一个整数 n(0& ...
- 【vs2010】转换到 COFF 期间失败: 文件无效或损坏
不知怎么本来编译好好的VS2010环境,忽然出现“转换到COFF 期间失败:文件无效或损坏”的链接错误.花了好多天,试了好多方法,最终解决了这个问题. 现在罗列一下这几种解决方案: 方案1: ...