第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):參數指定檔案資料源的路徑資訊。