20145317彭垚 《Java程序设计》第6周学习总结

20145317彭垚 《Java程序设计》第6周学习总结

第十章 输入/输出

10.1 InputStream与OutputStream

1、串流设计的概念

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

2、串流继承架构

(1)标准输入/输出

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

(2)FileInputStream与FileOutputStream

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

(3)ByteArryInputStream与ByteArryOutputStream

  • ByteArryInputStream是InputStrteam的子类,可以指定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

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

(2)DataInputStream与DataOutputStream

  • DataInputStream、DataOutputStream用来装饰InputStream、OutputStream,DataInputStream、DataOutputStream,提供读取、写入Java基本数据类型的方法,像是读写int、double、boolean等的方法。
    -来看例子。下面的Member类可以调用save()储存Member实例本身的数据,文件名为Member的会员号码,调用Member.load()指定会员号码,则可以读取文档中的会员数据。代码如下:
package cc.openhome;

import java.io.IOException;
import static java.lang.System.out;

public class MemberDemo {
    public static void main(String[] args) throws IOException {
        Member[] members = {
                    new Member("B1234", "Justin", 90), 
                    new Member("B5678", "Monica", 95), 
                    new Member("B9876", "Irene", 88)
        };
        for(Member member : members) {
            member.save();
        }
        out.println(Member.load("B1234"));
        out.println(Member.load("B5678"));
        out.println(Member.load("B9876"));
    }
}
  • 结果截图:

(3)ObjectInputStream与ObjectOutputStream

  • ObjectInputStream提供readObject()方法将数据读入为对象,而ObjectOutputStream提供writeObject()方法将对象写至目的地。可以被这两个方法处理的对象,必须操作java.io.Serializable接口,这个接口并没有定义任何方法,只是作为标示之用,表示这个对象是可以串行化的。如下面范例Member2Demo的运行结果与MemberDemo的运行结果是一样的。截图如下:

10.2 字符处理类

1、Reader与Writer继承架构

  • 针对字符数据的读取,Java SE提供了java.io.Reader类,其抽象化了字符数据读入的来源。针对字符数据的写入,则提供了java.io.Writer类。其抽象化了数据写出的目的地。FileReader、FileWriter则可以对文档做读取与写入,读取或写入时默认会使用操作系统默认编码来做字符转换。在启动JVM时,可以指定-Dfile.encoding来指定FileReader、FileWriter所使用的编码。

    2、字符处理装饰器

  • 正如InputStream、OutputStream有一些装饰器类,Reader、Writer也有一些装饰器类可供使用。如果串流处理的字节数据,实际上代表某些字符的编码数据,而你想要将这些字节数据转换为对应的编码字符,可以使用InputStreamReader、OutputStreamWriter对串流数据打包。BufferedReader、BufferedWriter可对Reader、Writer提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。PrintReader、PrintStream使用上极为类似,不过除了可以对OutputStream打包之外,PrintWriter还可以对Writer进行打包,提供print()、println()、format()等方法。

第十一章:线程与并行API

11.1.1

有时候需要设计程序拥有多个流程,也就是多线程程序。类操作java.lang.Runnable接口,接入点是run();通过Thread实例来执行Runnable实例定义的run方法,启动线程必须调用Thread的start方法。

11.1.2

定义线程的方法:

  • extends Thread
  • implements Runnable:有弹性

    11.1.3

  • Deamon线程:如果一个Thread标示为Deamon,在所有非Deamon线程结束时,JVM自动会终止。

  • Thread基本状态图:优先权高的先执行,否则输流执行。
  • 安插线程:join方法,先完成插入的线程,再回到原来的线程。
  • 停止线程:视需求操作。

    11.1.4

    每个线程都属于某个线程组群,可以自行定义线程组群。

    11.1.5

    在竞速情况下,脱离原本应管控的条件的类为不具备线程安全的类。
  • synchronized(执行该方法必须获得该实例的锁定):在方法上加上synchronized关键字,或者在描述句上加上它。如果使用不当会造成死结。

    11.1.6

    wait(),notify(),notifyall()是object定义的方法,可以通过他们控制线程释放对象的锁定,或者通知线程参与锁定竞争。

    11.2.1

  • lock:可以lock()取得对象锁定和unlock()解除锁定。调用trylock()时,如果不能锁定并不会发生阻断,而是返回fouse,无论成功与否都要解除锁定。
  • RwadWriteLock接口:定义了读取锁定与写入锁定行为,提高效率。
  • StampedLock:用来操作乐观读取,用于读取线程多而写入线程少的情况。先判断,再考虑是否真正锁定。
  • condition:取得多个conditon实例,可以有多个等待集合,提高效率。

学习进度条

 代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标 5000行 30篇 400小时  
第一周 200/200 2/2 20/20  
第二周 300/500 1/3 18/38  
第三周 500/1000 1/4 22/60  
第四周 300/1300 1/5 30/90  
第五周 800/2100 1/6 30/120  
第六周 600/2700 1/7 30/150  

参考资料

posted @ 2016-04-10 20:09  20145317彭垚  阅读(148)  评论(1编辑  收藏  举报