JDK 文档之 -- OutputStream 和 InputStream 的区别

流的概念
 
          流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。
            一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。
              流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。
            实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。
            形象的比喻——水流 ,内存======程序,内存和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流:流就是一个管道里面有流水,这个管道连接了文件和程序。


我们所说的流,都是针对内存说的,比如为什么打印到屏幕上就是System.out.println();而从屏幕等待用户输入的却是System.in呢?因为对于内存来说,把字符串打印到屏幕上是从内存流向屏幕这个显示器的,也就是输出,而从屏幕等待用户输入呢?就是等待键盘将字符输入到内存中。

所以,你根本就不用死记硬背,当你遇到IO的时候,就想两件事,第一,我的内存是中心,第二看看流的方向(矢量)!

好吧,那么往硬盘上写文件是out还是in呢?别一看到“写”文件你就说in,那是望文生义,你看,写文件的流向,是 内存---------->硬盘 内存为中心,到硬盘,OK 用out 那么就是FileOutputStream、BufferedOutputStream 等等

那读文件呢?是 内存<---------------硬盘 那么就是in了 , 看清楚数据的流向就OK!

那我访问网络,看网页是什么呢 网络--------------->内存 是in 因为我们访问页面是要抓取该页面得一个html文件,那我要是在网络上输入帐号密码登陆呢? 是不是内存的东西要写到该服务器上呢,所以当然是out了!

同样socket编程用到更多的IO,这里分别用Server(服务器端)和Client(客户端)来说明

Server: 遇到请求,网络----->内存 IN   服务器应答, 内存------->网络 OUT

----------------------------------------------------------------------------------------------

Client: 请求服务,    内存----->网络 OUT 服务器应答, 网络------->内存 IN

被搞糊涂了?那么你先别想太多,只是想是内存的数据出去了就是out 外设的东西到内存了就IN了


InputStream之所以叫输入类,是因为它要把要需要读取的内容转化成输入流,再从它那里进行读取,

而OutputStream之所以叫输出类,是因为它首先需要与写入的目的地相关联,然后通过它进行写入。

输入是:把要读取的内容输入到输入流,在从输入流进行读取,所以是read()。

输出是:把要输出的东西通过输出流输出到目的地,所以是write()。




1、在java中stream代表一种数据流(源),javaio的底层数据元,---(想像成水龙头)
2、任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象
既然它能产生出数据,我们就可以将数据取出,java对封装的通用方法就read()方法了--(出水龙头)
3、任何有能力接收数据源(流)的javaio对象我们就可以看作是一个OutputStream对象
同样,它能接收数据,我们就可以调用它的write方法,来让它接收数据--(进水龙头了,呵呵)
4、当然,我们可以在Inputstream和OutputStream数据源的基础上,从实际需要触发,
来重新封装出不同性能机制的输入、输出流了,java.io包中提供了很丰富的输入、输出流对象,如:
基于字节流的stream:
DataOutputStream----DataInputStream:
FileOutputStream-----FileInputStream:
.............等,可以用InputStream和OutputStream从JDK文档查阅
基于字符流的stream(典型的以write和reader来标识的):
FileWriter---FileReader:
StringWriter---StringReader:
.........等,你自己可以用Writer和Reader从JDK文档里头查看说明
stream应该是水龙头里的水资源,
InputStream:是一个出水龙头(把水封装在里头)的一个实物对象,该对象的read方法呢,就想成这个
出水龙头这一机制对象的开关钮,你read或openStream(其他对象包容InputStream对象的对象方法)一下呢,就等于打开了出水龙头的按钮,水就出来了,里头封装的水是什么性质的呢,你就用相应的容器来装,如string或byte[].....
OutputStream:你就在InputStream基础上反着想就ok了
-------------------------------------------------------------------------------------------------------------------------
OutputStream
(1)输出数据
   void write(int b)往流中写一个字节b
   void write(byte b[])往流中写一个字节数组b
   void write(byte b[],int off,int len)把字节数组b中从下标off开始,长度为len的字节写入流中
(2)
   flush()刷空输出流,并输出所有被缓存的字节
           由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。
(3)关闭流
   close()流操作完毕后必须关闭。
------------------------------------------------------------------------------------------------------------------------
InputStream
(1)从流中读取数据
   int read() 读取一个字节,返回值为所读得字节
   int read(byte b[]) 读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际独取的
                      字节的数量。
   int read(byte b[] ,int off,int len)读取len个字节,放置到以下标off开始字节数组b中,返回值为实际
                                       读取的字节的数量。
   int available() 返回值为流中尚未读取的字节的数量。
   long skip(long n);读指针跳过n个字节不读,返回值为实际跳过的字节数量
(2)关闭流
   close() 流操作完毕后必须关闭
(3)使用输入流中的标记
   void mark(int readlimit)纪录当前指针的所在位置.readlimit表示读指针读出的readlimit个字节后
                           所标记的指针位置才实效。
   void reset() 把读指针重新指向用mark方法所记录的位置
   boolean markSupported() 当前的流是否支持读指针的记录功能。
-----------------------------------------------------------------------------------------------------------------------

Java IO 通过 Stream (流)来实现 。关于流,可以理解为是一种“数据的管道”。管道中流动的东西可以是基于字节,也可以是基于字符的等。就好像管道里面可以流动水,也可以流动石油一样。

而对应于流还有一个概念:输入、输出设备。这些设备可以是磁盘文件、键盘(输入设备)、显示器(输出设备)、打印机(输出设备)、网络套接字等等。

下面,我们就来了解 “流”。

Java 中定义了两种类型的流:字节型,和字符型。

字节流:处理字节的输入和输出。包括读写二进制数据等方面的内容。

字符流:处理字符的输入和输出。他采用的是 Unicode 编码,可以实现国际化。使用字符流的另外一个好处就是:字符流比字节流更有效率。

字节流:

字节流包含两个顶层抽象类: InputStream 和 OutputStream 。

1 :字节流的两个顶层类是抽象类,分别是: InputStream 和 OutputStream 。

2 :每个抽象类都有子类来实现具体的功能,处理不同的设备的输入和输  出。

下面简单介绍字节流的几个常用子类:::

字节流类


功能简单介绍

DataInputStream


包含了读取 Java 标准数据类型的输入流

DataOutputStream


包含了写 Java 标准数据类型的输出流

ByteArrayInputStream


从字节数组读取的输入流

ByteArrayOutputStream


写入字节数组的输出流

FileInputStream


从文件读入的输入流

FileOutputStream


写入文件的输出流

PrintStream


包含最常见的 Print ()和 Println ()的输出流

PushbackInputStream


返回一个字节到输入流,主要用于编译器的实现

PipedInputStream


输出管道

PipedOutputStream


输入管道

SequenceInputStream


将 n 个输入流联合起来,一个接一个按一定顺序读取

RandomAccessFile


随机访问文件

BufferInputStream


缓冲输入流

BufferOutputStream


缓冲输出流

FilterInputStream


实现了 InputStream Interface

FilterOutputStream


实现了 OutputStream Interface

InputStream


抽象类,描述流的输入

OutputStream


抽象类,描述流的输入

抽象类 InputStream 和 OutpurStream 定义了实用的方法,其中最主要的是 read ()和

write ()。这两个方法在 InputStream 和 OutputStream 中声明为抽象方法,由子流类 overwrite 实现。

2 :每个抽象类都有子类来实现具体的功能,处理不同的设备的输入和输  出。

下面简单介绍字节流的几个常用子类:::

字节流类


功能简单介绍

DataInputStream


包含了读取 Java 标准数据类型的输入流

DataOutputStream


包含了写 Java 标准数据类型的输出流

ByteArrayInputStream


从字节数组读取的输入流

ByteArrayOutputStream


写入字节数组的输出流

FileInputStream


从文件读入的输入流

FileOutputStream


写入文件的输出流

PrintStream


包含最常见的 Print ()和 Println ()的输出流

PushbackInputStream


返回一个字节到输入流,主要用于编译器的实现

PipedInputStream


输出管道

PipedOutputStream


输入管道

SequenceInputStream


将 n 个输入流联合起来,一个接一个按一定顺序读取

RandomAccessFile


随机访问文件

BufferInputStream


缓冲输入流

BufferOutputStream


缓冲输出流

FilterInputStream


实现了 InputStream Interface

FilterOutputStream


实现了 OutputStream Interface

InputStream


抽象类,描述流的输入

OutputStream


抽象类,描述流的输入

抽象类 InputStream 和 OutpurStream 定义了实用的方法,其中最主要的是 read ()和

write ()。这两个方法在 InputStream 和 OutputStream 中声明为抽象方法,由子流类 overwrite 实现


你可能感兴趣的:(JDK 文档之 -- OutputStream 和 InputStream 的区别)