### 一、流的概念
流是一系列有顺序的字节的集合,是网络传输的载体,流可以包装成基本数据类型或对象,流有输入和输出,输入时是从流从数据源流向程序输出时是流从程序传向数据源,而数据源可以是内存,文件,网络或程序等,下面是流的输入和输出的图形化:
![这里写图片描述](https://box.kancloud.cn/2016-04-13_570df38a9c41a.jpg "")
### 二、流的分类
**(1)、流有字节流,字符流,输入流和输出流等。**
- 根据处理方向不同可分为:输入流和输出流。
- 根据处理数据类型不同可分为:字节流和字符流。
字节流和字符流的处理原理是相同的,只是处理的数据类型不同。
字节流是以字节为单位来传输,一个字节是8bit;
字符流是以字符为单位来传输,一个字符是16bit。
- 根据分工的不同可分为:节点流和处理流
**(2)、java I/O流基本类有**
字节流的抽象基类:
InputStream(字节输入流),OutputStream(字节输出流)
字符流的抽象基类:
Reader(字符输入流),writer(字符输出流)
其他类都由这4个抽象基本派生出来,详细的流的类图结构如下:
![这里写图片描述](https://box.kancloud.cn/2016-03-15_56e77dbc615d9.jpg "")
### 三、输入和输出流
**(1)、输入可使用:**
1.InputStream – 一个字节一个字节(byte)地从数据源读取。
*读取一个字节并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
int read() ;
*读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,如果读取前已到输入流的末尾返回-1。
int read(byte[] buffer) ;
*读取length个字节并存储到一个字节数组buffer,从off位置开始存,最多len, 返回实际读取的字节数,如果读取前以到输入流的末尾返回-1。
int read(byte[] buffer, int off, int len) ;
*关闭流释放内存资源。
void close() ;
2.Reader – 一个字符一个字符(char)地从数据源读取。
*读取一个字符并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
int read() ;
*读取一系列字符并存储到一个数组buffer,返回实际读取的字符数,如果读取前已到输入流的末尾返回-1。
int read(char[] cbuf) ;
*读取length个字符,并存储到一个数组buffer,从off位置开始存,最多读取len,返回实际读取的字符数,如果读取前以到输入流的末尾返回-1。
int read(char[] cbuf, int off, int len)
*关闭流释放内存资源。
void close()
**(2)、输入流可使用**
1.OutputStream:
*向输出流中写入一个字节数据,该字节数据为参数b的低8位。
void write(int b) ;
*将一个字节类型的数组中的数据写入输出流。
void write(byte[] b);
*将一个字节类型的数组中的从指定位置(off)开始的,len个字节写入到输出流。
void write(byte[] b, int off, int len);
*关闭流释放内存资源。
void close();
*将输出流中缓冲的数据全部写出到目的地。
void flush();
2.Writer:
*向输出流中写入一个字符数据,该字节数据为参数b的低16位。
void write(int c);
*将一个字符类型的数组中的数据写入输出流,
void write(char[] cbuf) throws IOException
*将一个字符类型的数组中的从指定位置(offset)开始的,length个字符写入到输出流。
void write(char[] cbuf, int offset, int length);
*将一个字符串中的字符写入到输出流。
void write(String string);
*将一个字符串从offset开始的length个字符写入到输出流。
void write(String string, int offset, int length);
*关闭流释放内存资源。
void close() throws IOException
*将输出流中缓冲的数据全部写出到目的地。
void flush() throws IOException
### 四、读写文本文件
**(1).写文本文件**
1.FileWriter是继承writer类,可调用write()方法往文本中写入内容。下面程序为调用FileWriter类的write(type c)方法的实现:
~~~
String fileName="d:\\demo1.txt";
FileWriter write=new FileWriter(fileName);
write.write("hell,io\n");
write.write("welcome to study\n");
write.write("加油,谢谢!");
write.close();
~~~
2.BufferedWriter类是带缓冲区的,比FileWriter要高效些,若写入的内容多优先使用此类,此类有一个newLine()方法,可换行。
下面程序为BufferedWriter类write(type c)方法的实现:
~~~
//处理内容较多的数据是,用BufferedWriter更高效
BufferedWriter bWrite=new BufferedWriter(new FileWriter(fileName));
bWrite.write("hell,io");
bWrite.newLine();
bWrite.write("welcome to study");
bWrite.newLine();
bWrite.write("加油,谢谢!");
bWrite.close();
~~~
不论使用哪种方式,结束时都需要close()关闭流,否则会导致资源耗尽问题。
**(2).读文本文件**
1.FileReader类是从文本文件读取字符,下面代码为FileReader类读取文本文件的实现,返回的是一个int类型数。若读取到末尾,则返回-1,下面为具体的实现:
~~~
FileReader read=new FileReader(fileName);
int len=read.read();
while(len!=-1){
System.out.println("len:"+len);
}
~~~
2.BufferedReader类是文本文件读取的缓存器类,调用readLine()方法,可一行一行的读取出整行字符,若读取到末尾返回null,下面为具体的实现:
~~~
BufferedReader read=new BufferedReader(new FileReader(fileName));
String line=read.readLine();
while(line!=null){
System.out.println("line:"+line);
line=read.readLine();
}
read.close();
~~~
同时不论使用哪种方式,结束时都需要调用close()关闭流,否则会导致资源耗尽问题.
### 五、读写二进制数据
对于纯文本文件里的内容都可解释为字符,可以用Reader和writer进行读写,但对于那些图片,声音的不是纯文本的内容,则需要利用二进制的字节方式进行读写,利用二进制字节读取数据要比字符快,且编码问题小。
**(1).写二进制字节数据**
FileOutputStream类:用于字节的输出;DataOutputStream类:用于将数据写到另一个输出流。下面为具体的实现:
~~~
DataOutputStream out =new DataOutputStream(new FileOutputStream(fileName));
out.writeInt(1);
out.writeDouble(11.20);
out.writeUTF("test");
out.close();
~~~
**(2).读二进制文件**
通过另外一个流来构造一个过滤流,常用的子类有
DataInputStream 和 BufferedInputStream。后者是将字节数据读取到缓冲区.相对要高效些。下面为具体的实现:
~~~
String fileName="d:\\demo.dat";
DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream(fileName)));
System.out.println(in.readInt()+"-"+in.readDouble()+"-"+in.readUTF());
in.close();
~~~
还有几个特殊的类,如:
LineNumberInputStream:构造一个读取指定的输入流的输入的新行号输入流。
PushbackInputStream:构建一个可预览一个字节或具有指定尺寸的缓冲区的流。
总结:本文主要分析了流的作用,流的分类,流的类图结构以及流的一些操作,比较基础,下篇将介绍流的文件管理,文档的压缩和对象序列化等操作。