1. 程式人生 > >JAVA基礎知識總結4——IO

JAVA基礎知識總結4——IO

輸出和輸入都是以程式為中心

File類:代表系統檔名(路徑和檔名)    
        可以進行建立、刪除檔案和路徑等操作,只對檔案本身進行操作,並不涉及檔案的具體內容
        路徑分隔符常量:public static final String separator;
                        String separator = File.separator;   
        建立帶路徑的檔案:
                建立檔案前判斷父路徑(getParentFile()取得父路徑)是否存在,
                如果不存在則應該先建立目錄(mkdirs()建立多級目錄),再建立檔案
        列出指定目錄下的所有檔案及子目錄資訊(FileList.java)
                先判斷給定的路徑是否是目錄,如果是則應該列出,再對每個子目錄進行判斷
                採用遞迴的方式
        判斷檔案是否存在:public boolean exists();
                
java.io包中定義了多個流型別來實現輸入輸出功能
所有的流型別都分別繼承四個抽象流(抽象類),
                位元組流      字元流
    輸入流:IntputStream    Reader
    輸出流:OutoutStream    Writer
繼承自IntputStream的流都是用於向程式中輸入資料,且資料的單位為位元組(8 bit)
繼承自Writer的流都是用於向程式中輸入資料,且資料的單位為字元(16 bit)
繼承自Reader的流都是用於向程式中輸出資料,且資料的單位為字元(16 bit)
繼承自OutputStream的流都是用於向程式中輸出資料,且資料的單位為位元組(8 bit)

節點流:可以從一個特定的資料來源(節點)讀寫資料(如檔案、記憶體),
處理流:“連線”在已存在的流(節點流和處理流)之上,通過對資料處理為程式提供更強大的讀寫功能

流相當於一個管道,比如fileInputStream就是連線在檔案的上一個管道。
FileInputStream in = new FileInputStream("E:\\Java\\eclipse-jee-mars-R-win32-x86_64 JDK 1.7+\\MyProject\\mydir1\\mydir2\\myfile2.txt");
in這個物件(管道)就連線在檔案myfile2.txt上,可以從檔案中輸出資料,輸入到程式中

處理流就是在管道外面再套一層管道,BufferedInputStream屬於處理流。
BufferedInputStream bis = new BufferedInputStream(in),
bis這個物件(管道)就是套在in這個管道外面的一個管道,也可以從檔案myfile2.txt上得到資料

輸出一般用列印流,輸入一般用BufferedReader或者掃描流

輸出
OutputStream常用方法:
a、public void close() throws IOException 關閉位元組輸出流
b、flush()這個函式是清空的意思,用於清空緩衝區的資料流,
    進行流的操作時,資料先被讀到記憶體中,然後再用資料寫到檔案中,
    那麼當你資料讀完時,我們如果這時呼叫close()方法關閉讀寫流,這時就可能造成資料丟失
c、public void write(byte b[], int off, int len) throws IOException  輸出部分位元組陣列資料
d、c表明使用OutputStream輸出資料必須是位元組型別資料,為了解決這個問題,java提供了列印流

FileOutputStream是抽象類OutputStream的一個字類,用於進行檔案操作
構造方法:public FileOutputStream(File file) throws FileNotFoundException   
            一根管道插在了檔案file上面,用於程式向檔案輸出資料
舉例:    P478

輸入
字元緩衝流輸入:a、    BufferedReader buf = new BufferedReader(new InputStreamReader(System.in))
                    //System.in是InputStream類物件,BufferedReader的構造方法裡面需要接收Reader類物件
                    //利用InputStreamReader將位元組流物件變為字元流物件
                 b、 BufferedReader in = new BufferedReader(new FileReader(file));
                    String str=in.readLine();
重點                //BufferedReader是Reader的子類,具有readLine方法(讀一行資料,且以String型別的形式返回)
            
位元組流和字元流的區別:
        a、位元組流直接與終端檔案進行資料互動,字元流需要將資料經過緩衝區處理才與終端檔案資料互動
        b、字元流可以對中文進行有效處理,如果沒有中文則推薦使用位元組流
            
轉換流:InputStreamReader、OutputStreamWriter
        構造方法:public InputStreamReader(InputStream in)
        InputStreamReader類的構造方法中接受InputStream類的物件,
        而InputStreamReader是Reader類的子類,該類可以向上轉型成Reader類物件,
        這樣可以把位元組輸入流轉換成字元輸入流
        
列印流: 
        PrintStream(位元組列印流)、PrintWriter(字元列印流)
        PrintStream是OutputStream的子類
        PrintStream的方法:
            構造方法:public PrintStream(OutPutStream out)
            普通方法:public void print()
                      public void println()

System.out是進行螢幕輸出的操作物件,是一個PrintStream類的例項化物件
            由於PrintStream是OutputStream的子類,所以也可以利用System.out為OutputStream類進行例項化
            OutPutStream out = System.out;
            Out.write("cqubob".getBytes[]);
System.in是進行鍵盤輸入的操作物件,是一個InputStream類的例項化物件
            InputStream input = System in;
            byte data[] = new byte[1024];
            int len = input.read(data);
            System.out.println(new String(data,0,len))

掃描流:java.util.Scanner
        構造方法:public Scanner(InputStream source)  接受InputStream輸入流物件,以此為輸入源
        方法:public boolean hasNext()   判斷是否有資料輸入
              public String next()         取得資料,以String的形式返回
              public Scanner useDelimiter(String pattern) 設定讀取的分隔符
        P512、
記憶體流: ByteArrayInputStream(記憶體位元組輸入流)、ByteArrayOutputStream(記憶體位元組輸出流)
            構造方法:public ByteArrayInputStream(byte buf[])
            構造方法:public ByteArrayOutputStream()
            在記憶體流例項化物件時就必須準備好要操作的資料資訊,
            記憶體流的操作實質就是將操作資料先儲存到記憶體(不是程式)中,然後利用IO流操作進行單個位元組的處理
            P498

物件序列化:將記憶體中所儲存的物件資料轉換為二進位制資料流進行傳輸的操作
            實現Serializable介面的類可進行序列化操作
            在開發中只有需要傳輸物件所在的類時才需要實現Serializable介面,主要是指簡單java類
            一個類中的屬性如果使用transient關鍵字宣告,則此屬性的內容不會被序列化
            物件的輸入輸出主要使用ObjectInputStream和ObjectOutputStream類完成
            
            
以後開發中,只要操作的不是二進位制資料,輸出都使用列印流,輸入使用掃描流或者字元緩衝區輸入流