天天看點

Java面向對象程式設計-第16章Java I/O系統

第16章 Java I/O系統

在Java中,把一組有序的資料序列稱為流。流可以分為輸入流和輸出流。程式從輸入流讀取資料,向輸出流寫入資料。

Java的I/O系統負責處理程式的輸入和輸出,I/O類庫位于java.io包中。按照資料流中最小的資料單元可以分為位元組流和字元流等。類庫中的InputStream和OutputStream對應位元組流,Reader和Writer對應字元流。

一、輸入流和輸出流概述

類庫包中的InputStream表示字元輸入流,OutputStream表示字元輸出流,都是抽象類,不能執行個體化。

InputStream類提供了一系列和讀取資料相關的方法:

1、int read():從輸入流讀取資料,主要有以下3種重載形式:

(1)int read():從輸入流中讀取一個8位的位元組,并轉換為0-255之間的整數,傳回。如果讀取遇到輸入流的結尾,則傳回-1。

(2)int read(byte[] b):從輸入流讀取若幹個位元組,并存儲到參數指定的位元組數組,傳回讀取的位元組數。如遇到結尾傳回-1。

(3)int read(byte[] b,int off,int len):從輸入流讀取若幹個位元組,儲存到b中。參數off指定在位元組數組中開始儲存資料的起始下标,參數len指定讀取的位元組數量。傳回實際讀取的位元組數,如果遇到結尾,傳回-1。

2、void close():關閉輸入流。當完成所有讀操作後,應當關閉輸入流。

3、int available():傳回可以從輸入流中讀取的位元組數目。

4、skip(long n):從輸入流中跳過n個位元組。

同樣OutputStream類提供了寫操作相關方法:

1、void write():向輸入流中寫入資料,同樣有3種重載形式:

(1)void write(int b):向輸出流中寫入一個位元組。

(2)void write(byte[] b):把參數b指定的位元組數組中的所有位元組寫到輸出流。

(3)void write(byte[] b,int off,int len):把參數b指定的位元組數組中的若幹位元組寫到輸出流,off指定位元組數組的起始下标,從這個位置開始輸出len個位元組。

2、void close():關閉輸出流。

3、void flush():強制把緩沖區的資料寫到輸出流中。

*為保證輸入流或輸出流及時關閉,一般都把關閉流的代碼放到finally代碼塊中,I/O操作通常采用以下流程:

InputStream in;
OutputStream out;
try{
  處理輸入流;
  處理輸出流;
}catch(IOException e){
  處理IO異常;
}finally{
  in.close();
  out.close();
}
           

二、輸入流

所有位元組輸入流都是InputStream類的直接或間接子類。幾種主要類型有:

1、ByteArrayInputStream:把位元組數組轉換為輸入流。

2、FileInputStream:從檔案中讀取資料。

3、PipedInputStream:連接配接一個PipedOutputStream。

4、SequenceInputStream:把幾個輸入流轉換為一個輸入流。

(一)位元組數組輸入流:ByteArrayInputStream類

ByteArrayInputStream類從記憶體中的位元組數組中讀取資料,其資料源是一個位元組數組,其構造方法包括:

(1)ByteArrayInputStream(byte[] buf):參數buf指定位元組數組類型的資料源。

(2)ByteArrayInputStream(byte[] buf,int offset,int length):參數buf指定位元組數組類型的資料源,參數offset指定從數組中開始讀資料的起始下标位置,length指定讀取位元組數。

import java.io.*;
public class ByteArrayTester {
    public static void main(String[] args)throws IOException{
        byte[] buff=new byte[]{,,,-,-,};
        ByteArrayInputStream in= new ByteArrayInputStream(buff,,);
        int data=in.read();
        while(data!=-){
            System.out.print(data+" ");
            data=in.read();
        }
        in.close(); 
    }
}
           

運作結果為:15 67 255 247

因為對于資料源中的-1和-9本為位元組型8位資料,轉為data的int型後數值發生變化。

(二)檔案輸入流:FileInputStream類

FileInputStream類從檔案中讀取資料,有以下構造方法:

(1)FileInputStream(File file):參數file指定檔案資料源。

(2)FileInputStream(String name):參數指定檔案資料源的路徑資訊。