天天看點

Java基礎--------(6)IO流InputStream和OutputStream

一、概念

流是一種抽象概念,它代表了資料的無結構化傳遞。按照流的方式進行輸入輸出,資料被當成無結構的位元組序或字元序列。從流中取得資料的操作稱為提取操作,而向流中添加資料的操作稱為插入操作。用來進行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進行輸入輸出。

二、三種分類方式

按流的方向分為:輸入流和輸出流
按流的資料機關不同分為:字元流(Reader、Writer)  位元組流(InputStream、OutputStream)
按流的功能不同分為:節點流和處理流
           
Java基礎--------(6)IO流InputStream和OutputStream

java.io.InputStream

抽象類,定義了輸入流的讀取位元組方法,所有的位元組輸入流都繼承自它。

java.io.OutputStream

抽象類,則是定義了輸出流的輸出位元組方法,所有的位元組輸出流都繼承自它。

java.io.Reader

抽象類,定義了輸入流的讀取字元方法,所有的字元輸入流都繼承自它。

java.io.Writer

抽象類,定義了輸出流的輸出字元方法,所有的字元輸出流都繼承自它。

三、流對象

  1. FileInputStream 和FileOutputStream

    FileInputStream可以從檔案系統中的檔案擷取輸入位元組。 什麼檔案可用取決于主機環境。

    FileOutputStream 檔案輸出流是用于将資料寫入到輸出流File或一個FileDescriptor 。 檔案是否可用或可能被建立取決于底層平台。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 通過檔案流複制檔案
 */
public class FileInputStreamDemo{

    public static void main(String[] args) {
        //File file = new File("."+File.separator+"10G.rar");
        //File file2 = new File("."+File.separator+"b.rar");
        File file = new File("."+File.separator+"demo.txt");//通過file連接配接檔案
        File file2 = new File("."+File.separator+"demo2.txt");
        if(!file2.exists()){
            try {
                file2.createNewFile();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }else{
            file2.delete();
        }

        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(file);//将file轉為檔案輸入流
            fos = new FileOutputStream(file2);
            System.out.println(file.length());
            byte[] b = new byte[];
            int count = ;
            int by=;
            long start = System.currentTimeMillis();
            while((by=fis.read(b))!=-){//将資料讀取到byte數組中
                count++;
                fos.write(b,,by);//寫入資料
            }
            long end = System.currentTimeMillis();
            System.out.println(count+"次");
            System.out.println(file2.length());
            System.out.println("所用時間"+(end-start));

        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(fis!=null)
            try {
                    fis.close();//關流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            if(fos!=null)
                try {
                    fos.close();//關流
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
        }

    }
}
           

2.PipedInputStream 和 PipedOutputStream

管道流是用來在多個線程之間進行資訊傳遞的Java的流,管道輸出流可以連接配接到管道輸入流以建立通信管道,而且并不建議嘗試從單個線程使用這兩個對象,因為它可能會使線程死鎖。

pos = new PipedOutputStream(); //建立未連接配接的輸出流
pis = new PipedInputStream(pos);//建立連接配接的輸入流
           

如果是單線程使用,read這個同步方法會導緻線程死鎖

3.FilterInputStream 和 FilterOutputStream

Filter流用于封裝其它的輸入流,并為它們提供額外的功能,主要的子類有

LineNumberInputStream(已棄用)
DataInputStream(資料輸入流)
           

允許應用程式以獨立于機器的方式從底層輸入流讀取原始Java資料類型。 應用程式使用資料輸出流來寫入稍後可以被資料輸入流讀取的資料。

DataInputStream對于多線程通路來說不一定是安全的。 線程安全是可選的

BufferedInputStream(緩沖輸入流)

當建立BufferedInputStream時,将建立一個内部緩沖區數組。 當從流中讀取或跳過位元組時,内部緩沖區将根據需要從所包含的輸入流中重新填充,一次有多個位元組。 mark操作會記住輸入流中的一點,并且reset操作會導緻從最近的mark操作之後讀取的所有位元組在從包含的輸入流中取出新的位元組之前重新讀取。

PushbackInputStream(回退流)

它能允許我們我們讀取流中資料,後再将它們傳回(回推)到流中。可以擷取來自輸入流的内容而不對它們進行破壞。

4.ByteArrayInputStream 和 ByteArrayOutputStream

位元組數組流,它包含一個内部緩沖區,該緩沖區包含從流中讀取的位元組
           

5.SequenceInputStream 和 SequenceOutputStream

SequenceInputStream表示其他輸入流的邏輯級聯。 它從一個有序的輸入流集合開始,從第一個讀取到檔案的結尾,然後從第二個檔案讀取,依此類推,直到最後一個輸入流達到檔案的結尾。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;


public class SequenceInputStreamDemo {

    public static void main(String[] args) {
        FileInputStream s1=null;
        ByteInputStream s2=null;
        try {
            s1 = new FileInputStream("."+File.separator+"demo.txt");
            String str="哈哈哈哈";
            byte[] b = str.getBytes();
            s2 = new ByteInputStream(b,b.length);
            FileOutputStream fos =  new  FileOutputStream("."+File.separator+"4.txt" ); 
            SequenceInputStream sis = new SequenceInputStream(s1, s2);
             byte [] buf =  new byte [  ];   
                int  len =   ;  
                while ((len = sis.read(buf))!= -  ){  
                    fos.write(buf,,len);  
                }  
            s1.close();
            s2.close();
            fos.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
           

5.ObjectInputStream 和 ObjectOutputStream

對象流,ObjectOutputStream将Java對象的原始資料類型和圖形寫入OutputStream。 可以使用ObjectInputStream讀取(重構)對象。 可以通過使用流的檔案來實作對象的持久存儲。 如果流是網絡套接字流,則可以在另一個主機上或另一個程序中重構對象。 ObjectInputStream用于恢複先前序列化的對象。 其他用途包括使用套接字流在主機之間傳遞對象,或者在遠端通信系統中進行封送和解組參數和參數。

ObjectInputStream隻能從流中讀取支援java.io.Serializable或java.io.Externalizable接口的對象。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectInputStreamDemo {

    public static void main(String[] args) {


        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        try {
            Aoo a = new Aoo("小明",,"太原");

            fos = new FileOutputStream("."+File.separator+"Object.txt");
            oos = new ObjectOutputStream(fos);
            oos.writeObject(a);

            fis = new FileInputStream("."+File.separator+"Object.txt");
            ois = new ObjectInputStream(fis);
            Aoo a1 = (Aoo) ois.readObject();
            System.out.println(a1);

            fos.close();
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}