一、输入(Input,Read):就是把别人送的东西弄回家。
输入流:像水一样流动,是动态的,如果水流到家了,表示结束
计算机:表示流入的信息如果保存起来,就结束流入。
第一: 东西存放(来源)不一样,取的方法也不一样,因此建立几个基础类,得到数据。
现实例子:快递到了小区门口,有三种方法拿到手:
1>大门口有一台机器(来源1),快递人员发短信去取
2>快递送到楼下(来源2),直接取
3>小区有一个快递驿站(来源3),可以取。
因此:我把东西从快递处拿回家的路上,就是输入流,表示包裹在流动,
我: 1》产生输入流
2》且带有包裹(数据)
所以java基础类:只提供数据,至于以什么方式取得数据,不用我们担心了。
1>因此基础类InputStream:就是产生输入流,并取到数据。
计算机存放数据的方式:
1>ByteArrayInputStream:表示从缓冲区直接读数据。
数据来源1:数据存放在缓冲区里
1》就是一个byte 数组,把数组直接转换输入流,这好像没有什么用
例子1:byte[] b1="qerwqtqtg".getBytes();
ByteArrayInputStream b2=new ByteArrayInputStream(b1);
2>字符串对象:java 1.0 StringBufferInputStream:对应字符串 现在改成 java1.1 StringReader
(来源2) :数据存放在 String 对象中。
数据来源1:从缓冲区中读数据放入StringReader中。
MemoryInput.java
import java.io.StringReader;
public class MemoryInput {
public static void main(String[] args) throws IOException {
//BufferedInputFile.read("MemoryInput.java"):就是一个String 对象。
StringReader in = new StringReader(BufferedInputFile.read("MemoryInput.java"));
int c;
while ((c = in.read()) != -1)
System.out.print((char) c);
}
}
3>文件:FileInputStream:从各种文件读出信息,用得非常多
(来源3) :数据存放在文件中;
4>PipedInputStream:就像快递公司中转站,进来的包裹,马上送出去。
第二:东西已经取回家了,直接放楼下的杂物间里,哪么拆开,按店主打好包的方式,分别搬回家!(这个应该和输出对应)出现了几个decorators 类,
数据组合方式不一样:这些东西是木地板,一箱子太重(当时提醒店主3块,4块绑在一起,好搬),肯定弄不上去,怎么办?
拆开箱子,里面已经有3块,4块的木地板绑在一起, 所以直接搬上楼。
数据组合类: DataInputStream,提供分成各种各样的组合的功能。
即一个数据可以有:几个int+几个double 等等
1>8个2进制为一组,一个字节Byte----对应的方法readByte())
2>4个字节为一组,int-----------对应的方法
等等。
组合类的父类:FilterInputStream
1>DataInputStream :现在已经有数据了,哪么
例子1:把数据分成字节组,一个字节一个字节循环读出来。
DataInputStream类:提供readByte();方法。
FormattedMemoryInput.java
package io;import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
public class FormattedMemoryInput {
public static void main(String[] args) throws IOException {
try {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(
BufferedInputFile.read("FormattedMemoryInput.java").getBytes()));
while (true)
System.out.print((char) in.readByte());
} catch (EOFException e) {
System.err.println("End of stream");
}
}
}
2>BufferedInputStream :当input 基础类读入数据后,放入缓冲区中,当需要要数据时,从缓冲中取。
Decorator design pattern:就是核心类(取数据的基础类)+许多重新组合(decorators), 一层new()对象之后外面再套一层new,建立许多新对象。
本来只有一个数据对象----对应建立很多对象,
Bruce Eckel says: the Java I/O library is awkward to use,呵呵!我也觉得,
二、输出(Output,Writer):就是把自己的东西给别人,产生输出流,让包裹流动起来。
首先:
1>把数据重新组合,即打包(decorators类),即一个大数据可以由:int+double+byte+float 混合而成。
2>把东西放入缓冲中
3>然后用基础类把缓冲区的东西送出去。
例如:家里搞装修,垃圾太多,买了15个能装50斤米的大蛇皮袋。
1>首先把垃圾堆在一个小房间里,然后把垃圾装入蛇皮袋,(计算机无表示)
2>叫了送垃圾的,人家一来觉得太重了,加点钱,人家也不弄。(这一步就是DataOutputStream)
只好重新买小蛇皮袋,垃圾重新组合(decorators类提供分成Byte,int组合),大约每袋10-20斤左右。
4>把要送出的垃圾放入小房间里(缓冲区 BufferedOutputStream)
4>把垃圾送出去(这就是输出基础类:ByteArrayOutputStream,FileOutputStream)。
产生输出流
第一:和外界打交道的类(即把自己的东西送出去)
1、ByteArrayOutputStream(送到缓冲区,必须设置缓冲区大小)
2、FileOutputStream(送到一个文件里)
第二:分组类(decorators),分组类的父类:FilterOutputStream
三、Reader,InputStream ,都是输入,区别
InputStream :面向字节(byte-Oriented)的读入
Reader:面向 character ,Unicode-compliant(2个字节编码,可以国际化),char-oriented
character:字母+空格+标点符号+其它符号 等
Unicode-compliant:全世界语言的编码。
UTF-8:全世界语言的编码,Unicode升级版,
比如对于美国佬的ASCII码只要8位就可以了,大大节省了空间,表示存贮信息时根据内容来定长度。
char-oriented:is 16-bit Unicode
编码:美国佬的8位2进制码是一个基本单位,基本上每个国家都有(8位ASCII码+自己国家语言的编码)。
哪么:各个国家以8位为一个基本单位(0--127)不用,其它随便编,
但是,编之后,计算机软件能识别就可以了。