一、流的概念
在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);