20145329Java程序设计第六周学习总结

教材学习内容总结

第十章

InputSream与OutputStream
  • Java中,输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream实例。

  • 在进行InputStream与OutputStream的相关操作时若发生错误,会抛出java.io.IOException异常。不使用InputStream与OutputStream时必须使用close()方法关闭串流。

  • FileInputStream是InputStream的子类,用于衔接文档以读入数据,FileOutputStream是OutputStream的子类,用于衔接文档以读出数据。

  • System.in与System.out分别是InputStream与PrintStream的实例,分别代表标准输入和标准输出。标准输出导向至文档,执行程序时使用>。例如>java Hello>Hello.txt,使用>>则是附加信息。

  • System.err为printStream实例,称为标准错误输出串流,它是用来立即显示错误信息。

  • FileInputStream主要操作InputStream的read()抽象方法,FileOutputStream主要操作OutputStream的write()抽象方法。FileInputStream、FileOutputStream在读取、写入文档时,以字节为单位。

  • 打包器类:使用打包器类可以为输入/输出的数据做加工处理。常用打包器有:
    +具有缓冲作用的BufferedInputStream、BufferedOutputStream(read()和write()可以到这里看是否有缓存的数据,节省时间)
    +具备数据处理作用的DateInputStream、DateOutputStream(提供读取、写入java基本数据类型的方法)
    +具备对象串行化能力的ObjectInputStream、ObjectOutputStream

  • java.io.Serializable()接口没有定义任何方法,只用来标示这个对象是可以串行化的。

  • 串行化时不希望被写出的数据成员可以标上transient。

字符处理类
  • Reader与Writer操作了Closeable接口,其父接口为AutoCloseable接口。Reader读入时先置入char数组中。

  • FileReader是一种Reader,主要用于读取文档并将读到的数据转换为字符,StringWriter是一种Writer,可以将字符数据写至StringWriter,最后使用toString()方法取得字符串,代表所有写入的字符数据。

  • 可以指定-Dfil.encoding来指定FileReader、FileWriter所使用的编码。

  • 常用字符处理装饰器:InputStreamReader与OutputStreamWriter对串流数据打包;BufferedReader与BufferedWriter提供缓存区作用;PrintWriter对OutputStream和Writer打包,提供print()、println()、format()等方法。

第十一章

线程
  • 在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是在run()方法中,加装的额外CPU就是创建Thread实例,执行流程的进入点也定义在这儿。另一个撰写多线程程序的方式,就是继承Thread类,重新定义run()方法,重新定义也可以执行其中的流程。

  • 在某些必须以匿名类语法构建Thread的场合,可以考虑用Lambda表达式操作Runnable,然后再用以建立Thread。例如:

    Thread someThread=new Thread(){
    public void run(){
    //方法操作内容
    }
    };
    可以改为用以下较简洁的方式操作:
    Thread someThread=new Thread((->{
    //方法操作内容
    }};
  • 线程周期

1.Daemon线程

如果一个Thread被标示为Daemon线程,在所有的非Daemon线程都结束时,JVM自动就会终止,可以用setDaemon()方法设定一个线程是否为Daemon线程,如果setDaemon()设定为true,程序会不断输出Orz而不终止,isDaemon可以判断线程是否为Daemon线程。

2.Thread基本状态图

线程进入Runnable状态,等待排班器排入CPU执行,线程才会执行run()方法,进入Running状态,CPU不断切换线程,动作很快,让线程看起来像是同时执行。

setPriority()方法设定优先权,可设定值为1~10,默认为5,超出设定值会抛出IlleagalArgumentException。

线程因输入/输出进入Blocked状态,在完成输入/输出后会回到Running状态,一个进入Blocked状态的线程可由另一个线程调用该线程的interrupt()方法让它离开Blocked状态。

3.安插线程

A线程运行中允许B线程加入,可以用join()满足。

4.停止线程
线程完成run()方法后,就会进入Dead,进入Dead的线程不可以再次调用start()方法,否则会抛出IlleagalArgumentException。被标示为Deprecated的API不建议撰写程序是再使用它。

直接调用Thread的stop()方法会释放所有已锁定的对象,使对象陷入无法预期状态,停止线程的最好自己操作,例如:

public class Some implements Runnable{
private boolean isContinue=true;
...
public void stop(){
isContinue=flase;
}

public void run(){
while(isContinue){
...
}}}
  • 每个线程都属于某个ThreadGroup,取得目前线程的所属名用Thread.currentThread().getThreadGroup().getName();,java.lang.ThreadGroup可以管理群组中的线程。enumerate()一次取得群组中所有线程;activeCount()取得群组线程数量;uncaughException()处理发生异常而未捕捉的线程。

  • 执行synchronized()区块必须先取得括号中的锁定,同时间只能有一个线程。

  • 标示为Volatile的变量不允许线程快取,变量值的存取一定是在共享内存中进行,且另一线程一定看得到,标示方法如:volatile static int i=0,j=0;

  • wait()、notify()、notifyAll()是Object定义的方法,线程调用waita()方法时,会先让出synchonnized区块使用权并等待通知,或是等待指定时间,直到被notify()时间到,再次调用wait() 执行。

并行API
  • 多线程程序可基于java.util.concurrent包中的API建立更稳固的并行应用程序,.util.concurrent包中提供接口:

    +Lock:Lock接口的额主要操作类之一为ReentrantLock,可以达到synchronized的作用,调用其中的try Lock()取得锁定返回true,无法取得时不会中断而是返回flase。

    +ReadWriteLock接口定义了读取锁定与写入锁定行为,可以使用readLock()、writeLock()方法返回Lock操作对象。它在没有任何读取或写入锁定时才可以取得写入锁定,可以用StampedLock类解决。例如:
    private StampedLock lock=new stampedLock();
    线程若调用get()方法进行读取操作,先取得读取锁定,这样其他线程后续也可再取得读取锁定。

    +Condition,其中的await()、signal()、signalAll()方法可视为Object的wait()、notify()、notifyAll()方法的对应。

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

    问题1:不太明白IO.dump(src,dest);的含义。
    解决:在IO实例中调用dump()方法从src中读,然后写入dest中。

问题2:System.SetIn(new FileInputStream(args[0]));
方法名称首字母大写会出现错误,setIn()这里的setIn是属于关键字还是方法名称的书写规范影响呢?

解决:setIn()是一个方法,重新分配标准输入流,过程中还知道了system.in、system.out的默认输入输出是键盘和显示器,不是文件。

问题3: Stream StandardOut。java代码System.setOut(printStream);中的setOut()是一个方法,printStream是一个实例,里面包含其他的方法,是否java也是可以方法套用的呢?

解决:这应该只是一个重新分配标准输出流到对象中,setOut()方法指定Printstream实例,将结果输出至指定目的地。另PrintStream是I/O流的一种,属于输出流,不包含方法,只有相关方法。

问题4:P326Thread Hare.java中的while(step<totalStep)是什么意思?

解决:总步数一定,即只要路程没有结束,乌龟就每秒走一步。

问题5:P334Thread JoinDemo.java中后面的解释说没有加jion()最后一行的描述会先执行完毕,是因为ThreadB使用了sleep()。我没有在程序中看到sleep()在哪儿操作?

解决:应该是ThreadB属于Thread的的子类,可直接使用Thread中定义的一些方法。

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

问题一:执行P314Stream MemberDemo.java代码时出现以下错误:
20145329Java程序设计第六周学习总结

解决:报错进行堆栈追踪,不过看不懂,待解决~

本周代码托管截图

20145329Java程序设计第六周学习总结

20145329Java程序设计第六周学习总结

20145329Java程序设计第六周学习总结

感悟

现在学的Java的内容都是属于基础的,需要记忆、理解、在代码中应用,基础的东西都是很细微又很繁琐却也是必须的,学起来很辛苦,每一条语句都是可以理解的,障碍在于知识点的数量,希望自己坚持~

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 50/50 2/2 20/20 实现“HelloWorld”
第二周 100/150 2/4 20/20 学会用IDEA编写代码
第三周 100/250 2/6 20/20 掌握更多的语法知识
第四周 150/400 1/7 20/20 学会用Git托管代码
第五周 200/600 1/8 20/20 掌握更多的语法知识
第六周 500/1100 2/10 20/20 线程与并行API
更多相关文章
  • 20145311Java程序设计第六周学习总结
    20145311 <Java程序设计>第六周学习总结 教材学习内容总结 第十章(Input&&Output) 10.1InputStream OutputStream 10.1.1串流 -Java中的数据有来源(source)和目的地(destination),衔接两者的 ...
  • 20145221Java程序设计第六周学习总结
    20145221 <Java程序设计>第六周学习总结 教材学习内容总结 第十一章部分 - 输入与输出 文件的读写 网络上传数据的基础 同样要先掌握父类中方法,核心类如下: 以上则是老师提出来的掌握本章内容的诀窍,学好这一章内容非常重要,不仅是对之前的补充,也是为以后更加深入学习Java打 ...
  • #20145329Java程序设计第七周学习总结
    教材学习内容总结 +JDK出现之前就已经存在的java.util.Date与java.util.Calendar等API +如果想取得系统时间,方法之一是使用System.currentTimeMillis()方法,返回值是long类型整数 +使用Date实例来取得系统时间描述,不过Date也是偏向 ...
  • 20145329Java程序设计第五周学习总结
    20145329 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 Java异常处理是要处理Exception类及其子类(Checked Exception),RuntimeException及其子类也不用处理(Unchecked Exception) Multi-catch ...
  • #20145329Java程序设计第八周学习总结
    教材学习内容总结 日志 1.java.util.logging包提供了日志功能相关类与接口.2.使用日志的起点是Logger类,Longer类的构造函数标示为protected,不同包的类药取得Loger实例必须使用它的静态方法getLogger(),取得实例后可以使用log()方法输出信息.3.取 ...
  • 20145329Java程序设计第三周学习总结
    教材学习内容总结 java并非完整的面向对象程序语言 定义 1:class:定义类2.char:类型声明变量3.new:新建对象4.名称 X:参考5.=:可用于指定参考至新建变量6.构造函数:与类名称同名,无须声明返回类型的方法 两个基本标准类 1.java.util.Scanner+scanner ...
  • 20145319第六周学习总结
    20145319 <Java程序设计>第六周学习总结 教材学习内容总结 本周学习教材的第十.十一章,主要讲述了串流,字符处理和线程以及并行API 1. 输入输出 串流:1Java中的数据有来源(source)和目的地(destination),衔接两者的就是串流对象2串流设计:在不知道限 ...
  • 20145304Java第六周学习报告
    20145304<Java程序设计>第六周学习总结 教材学习内容总结 1.InputStream与OutputStream: 在Java中,输入串流的代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream实例. 取得InputSt ...
一周排行
  • Struts2教程7:上传任意多个文件    在Web程序中的上传文件的功能一般会使用<input type=file.../>标签在客户端显示输入要上传的文件名的用户接口.如果读者使用过JSP/Serv ...
  • 3月29日消息,随着移动互联网的发展,手机浏览器作为移动互联网的重要“入口”,其战略作用日益引起产业链各方的重视.包括中国移动在内的电信运营商很早也开始关注这一领域,期间传闻不断,但一直未见产品面世. 3月22日得到 ...
  • cmd--回车,输入netstat-ano--回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后还不起作用,就用nts ...
  • 在编写shell脚本的过程中相信大家都会遇到这样的场景:#!/bin/sh # log_1="xxxxxx" log_2="yyyyyy" log_3="zzzzzz ...
  • 注册表Policies的权限设置,system为完全控制,其他系统管理员账户都为只读.可防止360修复注册表禁用.可用gpedit.msc恢复注册表.禁用gpedit.msc可设置mmc.exe的权限.  注册表内容 ...
  •       对于扎进互联网这池浑水中摸鱼的创业者来说,已经耳濡目染了太多关于互联网造富的神话.从优秀学生干部标兵陈天桥依靠一款<传奇>书写百亿富豪传奇,到今年过节不受礼的史玉柱依靠<征途>完胜 ...
  • 还不错的东西  要安装ncd包
  • JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? |-  首先,Java语言提供的类库无法满 ...
  • Bellman-Ford算法判负环
    算法思想:如果没有负权回路,dis数组应该会在n-1次松弛之后结束. 算法复杂度:O(n* ...