20155335俞昆《java程序设计》第6周总结
20155335 《Java程序设计》第6周学习总结
## 教材学习内容总结
首先,我们需要了解输入和输出的关系,我想,这不同于c语言中的输入和输出,我们首先明白,Java中以串流(Stream)抽象化输入和输出的概念,以及InputStream和Outstream继承架构。
如果将数据从来源输出,可以使用输入串流,如果将数据写入目的地,可以写出输出串流,在Java中,输入串流的代表对象为java.io.InputStream,输出串流的代表对象时java.io.OutputStream实例,我们做的是要设法取得InputStream和OutputStream实例。
要解决的问题是来源和目的地都不知道的情况下去如何撰写程序,可以设计一个通用的dump()的方法,

dump的方法接受InputStream和OutStream实例,分别代表数据的来源,以及输出的数据和目的地,若进行InputStream和OutStream的相关操作若发生错误,会抛出java.io.IOExprction异常,在这里不是特别处理,而是在dump方法上声明throws,由调用dump()的方法的客户端处理。
不使用InputStream和OutStream方法是,必须用close()方法关闭串流,此方法操作了Java.io.Closeable接口,其父接口为java.lang.AutoClose接口。读取数据时,可以使用write()方法,指定要写出的byte数组,初始索引和数据长度。
Dump方法的来源也依赖于InputStream和OutStream,将某个文档读入并另存为另一个文档,这样

如果从HTTP服务器读取某个网页,并另存为一个文档,可以使用设计的dump方法,例如

串流的继承架构是要在了解串流抽象化数据源和目的地概念后,需要弄清楚InputStream和OutStream的继承架构,对其做一个简单的阐述,即BufferedInputStream和DataInputStream共同构成FilterInputStream,FilterInputStream和FileInputStream、ObjectInputStream以及ByteArrayInputStream又共同构成InputStream。
对于OutputStream的常用类继承架构,可以这样阐释。
它由FileOutputstream和ByteArrayOutputStream以及ObjectOutPutStream、FiterOutputStream构成,其中FiterOutputStream又由BufferedOutputStream、DataoutputStream和PrintStream构成。
System.in和System.out分别代表标准输入和标准输出,以个人计算机而言,对应文本模式的输入和输出。对system.in而言,较少直接操作InputStream的方法,而是如前面章节所使用的Java.util.Scanner打包System.in,如果操作Scanner相关类型方法,Scaneer类型会代我操作System.in取得数据。
重新指定标准输出来源,可以使用System的setIn()方法指定InputStream实例,下面范例故意将标准输入指定为FileInputStream可以读取并指定文档并显示在文本模式。

可以使用System的setOut()方法指定PrintStream实例,将结果输出至指定目的地,例如故意将标准输出至文档:

PrintStream接受InnputStream实例,在这个范例中用PrintStream打包FileOutStream我操作PrintStream相关方法,在程序中,PrintStream会代我操作FilStream。
FileInputStream是InputStream的子类,可以指定文件名创建实例,文档开启,就可以用来读取数据。FileOutputStream主要操作了InputStream的read()的抽象方法,是之可以从文档中操作数据,FileOutputstream主要操作了Output的write()的抽象方法,是之可用数据至文档,前面的IO.dump
方法已示范过该方法。
ByteArrayInputSteam与ByteArrayOutputStream
ByteArrayInputStream是Inputstream的子类,可以指定Byte数组创建实例,一旦创建,就可将数据源进行读取,ByteArrayOutput是Outputstream的子类,可以指定Byte数组创建实例,一旦创建将Byte数组当做目的地写入数据。
ByteArrayInputStream主要操作了InputStream的read()抽象方法,是之可以从Byte数组中读取数据。前面的IO.dump()方法示范过了。
对于串流处理装饰器,如果想要为输入/输出的数据做加工处理,可以使用打包器类。
InputStream、outstream的一些子类具有打包器的作用,子类创建时,可以接受InputStream、OutPutstream的实例,我操作printStream的print(),printIn()等方法,printstream会自动转换数组数据,利用打包的OutputStream进行输出。
由于某些类本身并没有改变Inputstream和outStream的行为,只是取得数据后做了一些加工处理,或者是输出后做了一些加工处理,交由OutputStream进行真正输出,因此称他们为装饰器。
常用的串流装饰类,最典型的是BufferdInputstream和BufferedOutputStream实例,每次read()时都会要求读取硬盘,write时会要求写入硬盘。
改写前面的IO.dump为Buffered。IO.dump的方法如下

对于DataInputStream与DataOutputStream,用来装饰InputStream等提供读取、写入java基本数据类型的方法,这些方法可以自动转换。
下面Member类可以调用save()储存的Member实例本身的数据,文件名为Member的会员号码,调用Member.load()指定会员号码,可以读取文档中的会员数据,封装为Member后的实例返回。

字符处理类
reader和writer的继承架构
针对字符数据的读取,Java SE 提供了java.io.reader类,其抽象化了字符数据读入的来源,针对字符数据的写入,则提供java.io.Writer类,其抽象化了数据写出的目的地。
如果想从来源读入字符数据,或将字符数据写至目的地,都可以使用下面的CharUtil.dump()方法。
Dump方法接受Reader与writer的实例,分别代表读取数据的来源,以及输出数据的目睹地,在进行Reader与writer 的相关操作时若发生错误,会抛出IOExpection异常,在这里,会在dump()方法上声明Throws,由调用的dump()方法的客户端处理。