Java IO 流(二)

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將內部數據轉爲String
writeTo(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

實現了對於各類基本數據結構的讀寫的方法,也是裝飾類

八、PushbackInputStream

提供了回退流的機制,能夠將已經讀出來的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異常。

想象流是一個隊列,每次都是從隊列頭讀出流數據,回退流就是往頭上在寫回數據,注意寫回數據的長度不能大於「回推緩存」,這個回推緩存實在回退流的構造函數中定義的

 九、Sequenceinputstream

將兩個流合併,要合併多個流能夠經過指定Enumeration<InputStream>來處理

十、PrintStream

PrintStream 是打印輸出流,可以方便地打印各類數據值表示形式。 
System.out就是一個PrintStream實例,使用方法相似,需注意方法append(),向流的尾部追加內容。默認狀況PrintStream是自動flush的
print()和println()都是將其中參數轉換成字符串以後,再寫入到輸入流。

相關文章
相關標籤/搜索