1 流的概念
在java中,流(stream)代表一个数据来源,或者一个数据目的地。Stream是对数据源的一种整体抽象,一个stream可以是一个文件,或者一个socket,在很多教程中,都提到可以将stream看成一个与目的数据源操之间的管道,我们利用这个管道从数据源中读取或者写数据,总之,只要我们获取到了一个流,我们对这个流的操作就会影响到流的另一端。图1和图2分别是利用了流读取和写数据。
图1
图2
2 字符流和字节流
从图1和图2中能够看出,其实最终的流中流动的一定是0和1。对于输入流而言,程序把需要传输的二进制流放在流中,传到指定位置。
如果我们只需要操作byte,那么有字节流就够了,然而,我们在实际应用中,一般都需要编码,关于编码,大家可以再去网上看看,本文只做简单接受,比如对于同一个字符而言,不同的编码方式,可能需要不同的字节来对应,因此如果我们如果传输数据的时候只是简单的利用字节流,可能会出现问题,我这里做个简单的例子进行说明,假设我现在从A向B传输数据,对于同一个字符,如果说我们传一个“我”,但是A是utf-8编码,可能是2个字节(这里只是假设),B用utf-16解码,但是utf-16的“我”需要三个字节表示,当B接收到A的两个字节时,根本不认识这是个什么字,或者干脆解析成了其他的字符,所以这一定是行不通的。
A------>B
为了便于我们对字符进行操作,java又提出了字符流的概念,即让A传输的时候以字符为单位。这里有一个问题,很多的教程里都说java里字节流和字符流是一种对立的关系,但是我认为这是一个误区。
1:无论是字节流,字符流,电脑只认识0和1,任何数据的存储和传输都是以字节为单位的。
2:字符流,并不是说直接传输字符,而是将字符按照指定的编码规则,转成对应的字节流后进行传输。
3:虽然在java中字符流和字节流都是相对顶级的类(io中基础类),但是它们是有联系的,字符流其实只是对字节流的一个包装。
在节中,如果想要学的透彻,需要查看其他关于编码的问题,网上一堆,随便看看就行,关于字节流和字符流,后面我将用java的代码具体分析。