一、流的概念
在Java中,流是从源到目的地的字节的有序序列。Java中有两种基本的流——输入流(InputStream)和输出流(OutputStream)。
根据流相对于程序的另一个端点的不同,分为节点流和过滤流。
(1)节点流:以特定源如磁盘文件、内存某区域或者线程之间的管道为端点的构造输入输出流,是一种基本的流。
(2)过滤流:以其他已经存在的流为端点构造的输入输出流。
根据流中的数据单位分为字节流和字符流。
(1)字节流:流中的数据是以8位字节为单位进行读写,以InputStream和OutputStream为基础类。
(2)字符流:流中的数据是以16为字符为单位进行读写,以Reader和Writer为基础类。
二、字节流
InputStream和OutputStream是字节流的两个顶层父类,提供了输入流类和输出流类的通用API。
1、输入字节流
InputStream基本方法:
(1)基本读方法;: int read() int read(byte[] b) int read(byte[] b,int off,int len)
(2) 关闭流:void close()
(3) 返回输入流中还有多少可读字节 int available()
(4) 跳过指定字节 long skip(long n)
(5) 回读数据 boolean markSupported() void Mark(int readlimt) void reset()
2 、输出字符流
OutputStream基本方法:
(1)基本写方法:void write(int c) void write(byte[] b) void write(byte[] b,int off,int len)
(2) 关闭流:void close()
(3)q强制输出:void flush()
三、字符流
Reader和Writer是字符流的顶层父类,字符流能够处理Unicode字符集中的所有字符。成员方法和字节流类似。
四、输入输出流的套接
节点流在程序中不是很常见,一般通过过滤流将多个流套接起来,利用各个流的特性共同处理数据。
例如下图:一个文件流为了为了提高效率,套接了缓存流,最后套接了数据流。
五、常见的输入输出流
1、文件流:文件流属于节点流,包括FileInputStream和FileOutputStream类以及Reader和Writer类。这些类都是对文件系统中的文件进行读写。文件流的创建是调用相应的构造方法,并经常以字符串形式的文件名或者一个File类的对象为参数,例如:
1 public FileInputStream(String name); 2 public FileInputStream(File file);
例如使用文件流实现文件的复制:
package ch01; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CopyBytes { public static void main(String[] args) throws IOException { FileInputStream fileis = new FileInputStream(new File("E:\file/FileTest01.txt")); FileOutputStream fileos = new FileOutputStream(new File("E:\\file/FileTest02.txt")); int c; while ((c=fileis.read()) != -1) { fileos.write(c); System.out.println(c); } fileis.close(); fileos.close(); System.out.println("OK"); } }
2、使用文件字符流实现
1 package ch07; 2 3 import java.io.FileReader; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 7 public class Copy { 8 public static void main(String[] args) throws IOException{ 9 //创建文件字符输入/输出流 10 FileReader in =new FileReader("E:\workspace\tmpfile\farrago.doc"); 11 FileWriter out=new FileWriter("E:\workspace\tmpfile\outagainb.doc"); 12 int c; 13 while((c=in.read())!=-1){ 14 System.out.println(c); 15 out.write(c); 16 } 17 in.close(); 18 out.close(); 19 20 21 } 22 }
六、缓冲流
缓冲流BufferedInputStream和BufferedOutputStream类和BufferedReader和BufferedWriter类。这种流把数据从原始流成块读入或者积累到一个大数据快的时候在成批写出。BufferedOutputStream和BufferedWrite仅仅在缓冲区满或者调用flush()时候才把数据写到目的地。
构造方法:
public BufferedInputStream(InputStream in) public BufferedInputStream(InputStream in,int size)
七、管道流
管道流可以实现线程之间的数据的直接传输。
1、管道流模型:
PipedReader/PipedInputStream实现管道的输入流,而PipedWriter和PipedOutputStream实现输出流。
2、管道流的创建:
管道流的创建是将管道输入流和管道输出流进行挂连。构造方法有下面两种方式:
1 PipedInputStream pInputStream=new PipedInputStream(); 2 PipedOutputStream pOutputStream=new PipedOutputStream(pInputStream); 3 或者 4 PipedInputStream pInputStream=new PipedInputStream(); 5 PipedOutputStream pOutputStream=new PipedOutputStream(); 6 pInputStream.connect(pOutputStream); 7 pOutputStream.connect(pInputStream);