java IO教程連接html
InputStream和OutputStream的對應關係以下:java
這裏針對每個類,分別作一些實例和介紹:
一、InputStream、OutputSTream設計模式
InputStream\OutSTream是抽象類,定義了關於字節流操做的最基本的方法
InputStream: available() / read() / mark() /reset() / skip() / / close()
OutputStream: close() / flush() / write()
對於InputStream mark()標記當前流的位置,reset()返回到上次標記的流的位置,skip(int n)跳過n個字節markSupported()
二、ByteArrayInputStream、ByteArrayOutputStream數組
把Byte轉換爲InputStream
//構造方法,其餘方法與InputStream相同
ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf, int offset, int length)
ByteArrayInputStream bais = new ByteArrayInputStream(ArrayLetters);
/ 從字節流中讀取5個字節 for (int i=0; i<LEN; i++) { if (bais.available() >= 0) { int tmp = bais.read(); System.out.printf("%d : 0x%s\n", i, Integer.toHexString(tmp)); } }
ByteArrayOutputStream中是有一個能夠隨着輸入增加的byte數組緩衝區的,能夠用來方便的緩存數據:
主要的用到的方法是可用
經過toByteArray()獲得內部的Byte數組,
經過toString將內部數據轉爲StringwriteTo(OutputStream out)
將內部的byte數組寫入到另一個輸出流中
緩存
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(f)); ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); int c; while((c=bis.read())!=-1){ byteArrayOutputStream.write(c); } System.out.println(byteArrayOutputStream); byte[] b=byteArrayOutputStream.toByteArray(); System.out.println(new String(b));
三、FileInputStream和FileOutputStream
鏈接地址數據結構
FileInputStream 和FileOutputStream適用於操做於任何形式的文件(由於是以字節爲嚮導),若是想要操做文本文件,採用FileInputReader和FileOutputWriter效率更高多線程
FileChannel getChannel() //用於在java nio中的Channel
FileDescriptor getFD() // 返回該文件的文件描述符 同時文件輸入\輸出流 均可以經過FD進行構造app
其餘的方法與InputStream以及OutputStream的方法同樣ide
FileDescriptor是文件描述符
就是用來描述一個文件的。
能夠用來做爲在多個流之間的橋樑(文件的輸入輸出流均可以經過FD構造,也都能生成FD對象)
FileDescriptor中有三個常量in、out、err,分別是標準輸入、輸出、錯誤的句柄
四、ObjectInputStream和ObjectOutputStream
主要用於對象的序列化操做函數
Person p=new Person("lz",19); Person p1=new Person("lz1",191); try { FileOutputStream fo=new FileOutputStream("D:/ww"); ObjectOutputStream oo=new ObjectOutputStream(fo); oo.writeObject(p); oo.writeObject(p1); oo.close(); } catch (IOException e) { e.printStackTrace(); } try { FileInputStream fi = new FileInputStream("D:/ww"); ObjectInputStream oi = new ObjectInputStream(fi); Person p3=(Person) oi.readObject(); Person p4=(Person) oi.readObject(); System.out.println(p3.getName()); System.out.println(p4.getName()); } catch (IOException e){ e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }
五、PipedInputStream和PipedOutputStream
用於在多線程之間的單向的管道的通訊,使用connect方法把兩個管道給關聯起來
class Sender implements Runnable{ PipedOutputStream pos=new PipedOutputStream(); public void connect(PipedInputStream pipedInputStream) throws IOException { pos.connect(pipedInputStream); } @Override public void run() { StringBuffer sb=new StringBuffer("The Meaasge is:"); for (int i = 0; i < 100; i++) { sb.append(i); try { pos.write(sb.toString().getBytes()); Thread.sleep(500); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Receiver implements Runnable{ PipedInputStream pis=new PipedInputStream(); public void Receiver(PipedOutputStream ops) throws IOException { pis.connect(ops); } @Override public void run() { while (true){ int num= 0; try { if((num = pis.available())>0) { byte b[] = new byte[num]; pis.read(b); System.out.println(new String(b)); } } catch (IOException e) { e.printStackTrace(); } } } } public class _PipedStream { public static void main(String[] args) { Sender s=new Sender(); Receiver r=new Receiver(); try { s.connect(r.pis); //將兩個流鏈接起來 } catch (IOException e) { e.printStackTrace(); } Thread t1=new Thread(s); Thread t2=new Thread(r); t1.start(); t2.start(); } }
六、BufferedInputStream與BufferedOutputStream
BufferedInputStream是帶緩衝區的輸入流,默認緩衝區大小是8M,可以減小訪問磁盤的次數,提升文件讀取性能;BufferedOutputStream是帶緩衝區的輸出流,可以提升文件的寫入效率。BufferedInputStream與BufferedOutputStream分別是FilterInputStream類和FilterOutputStream類的子類,實現了裝飾設計模式。
構造方法是傳入InputStream和OutPutStream,能夠指定緩衝區的大小,默認的緩衝區的大小是8M
七、DataInputStream和DataOutputStram
實現了對於各類基本數據結構的讀寫的方法,也是裝飾類
提供了回退流的機制,能夠將已經讀出來的byte放回去,或者將指定的內容放到流中
PushbackInputStream(InputStream inputStream) PushbackInputStream(InputStream inputStream,int numBytes) 第二種形式建立的流對象具備一個長度爲numBytes的回推緩存,從而容許將多個字節回推到輸入流中。 void unread(int b) void unread(byte[] buffer) void unread(byte[] buffer,int offset,int numBytes) 第一種形式回推b的低字節,這會使得後續的read()調用會把這個字節再次讀取出來。第二種形式回推buffer中的字節。第三種形式回推buffer中從offset開始的numBytes個字節。
當回推緩存已滿時,若是試圖回推字節,就會拋出IOException異常。
想象流是一個隊列,每次都是從隊列頭讀出流數據,回退流就是往頭上在寫回數據,注意寫回數據的長度不能大於「回推緩存」,這個回推緩存實在回退流的構造函數中定義的
將兩個流合併,要合併多個流能夠經過指定Enumeration<InputStream>來處理
十、PrintStream
PrintStream 是打印輸出流,可以方便地打印各類數據值表示形式。
System.out就是一個PrintStream實例,使用方法相似,需注意方法append(),向流的尾部追加內容。默認狀況PrintStream是自動flush的
print()和println()都是將其中參數轉換成字符串以後,再寫入到輸入流。