《Java編程思想第四版》筆記---18章(3) I/O 流式部分--字元流位元組流__演算法

來源:互聯網
上載者:User
Java.IO流類庫

在java.io包中有四個基本類:InputStream、OutputStream及Reader、Writer類,它們分別處理位元組流和字元流:



JDK1.4版本開始引入了新I/O類庫,它位於java.nio包中,新I/O類庫利用通道和緩衝區等來提高I/O操作的效率。

在java.io包中, java.io.InputStream 表示位元組輸入資料流, java.io.OutputStream表示位元組輸出資料流,處於java.io包最頂層。這兩個類均為抽象類別,也就是說它們不能被執行個體化,必鬚生成子類之後才能實現一定的功能。


二. io流的具體分類

(一)按I/O類型來總體分類:

1. Memory

1)從/向記憶體數組讀寫資料: CharArrayReader、 CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream

2)從/向記憶體字串讀寫資料 StringReader、StringWriter、StringBufferInputStream

2.Pipe管道

實現管道的輸入和輸出(處理序間通訊): PipedReader、PipedWriter、PipedInputStream、PipedOutputStream

3.File 檔案流

對檔案進行讀、寫操作 :FileReader、FileWriter、FileInputStream、FileOutputStream

4. ObjectSerialization 

對象輸入、輸出 :ObjectInputStream、ObjectOutputStream

5.DataConversion資料流 

按基礎資料型別 (Elementary Data Type)讀、寫(處理的資料是Java的基本類型(如布爾型,位元組,整數和浮點數)):DataInputStream、DataOutputStream

6.Printing 

包含方便的列印方法 :PrintWriter、PrintStream

7.Buffering緩衝  

在讀入或寫出時,對資料進行緩衝,以減少I/O的次數:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream

8.Filtering 濾流

在資料進行讀或寫時進行過濾:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream過

9.Concatenation合并輸入 

把多個輸入資料流串連成一個輸入資料流 :SequenceInputStream

10.Counting計數  

在讀入資料時對行記數 :LineNumberReader、LineNumberInputStream

11.Peeking Ahead 

通過緩衝機制,進行預讀 :PushbackReader、PushbackInputStream

12.轉換流

位元組流轉字元流:InputStreamReader、OutputStreamWriter


(二)按資料來源(去向)分類:

1、File(檔案): FileInputStream, FileOutputStream, FileReader, FileWriter

2、byte[]:ByteArrayInputStream, ByteArrayOutputStream

3、Char[]: CharArrayReader, CharArrayWriter

4、String: StringBufferInputStream, StringReader, StringWriter

5、網路資料流:InputStream, OutputStream, Reader, Writer
三、位元組流InputStream/OutputStream

1. InputStream抽象類別

InputStream 為位元組輸入資料流,它本身為一個抽象類別,必須依靠其子類實現各種功能,此抽象類別是表示位元組輸入資料流的所有類的超類。 繼承自InputStream  的流都是向程式中輸入資料的,且資料單位為位元組(8bit);

InputStream是輸入位元組資料用的類,所以InputStream類提供了3種重載的read方法.


Inputstream類中的常用方法:

(1) public abstract int read( ):讀取一個byte的資料,傳回值是高位補0的int類型值。若傳回值=-1說明沒有讀取到任何位元組讀取工作結束。

(2) public int read(byte b[ ]):讀取b.length個位元組的資料放到b數組中。傳回值是讀取的位元組數。該方法實際上是調用下一個方法實現的

(3) public int read(byte b[ ], int off, int len):從輸入資料流中最多讀取len個位元組的資料,存放到位移量為off的b數組中。

(4) public int available( ):返回輸入資料流中可以讀取的位元組數。注意:若輸入阻塞,當前線程將被掛起,如果InputStream對象調用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調用才有用,

(5) public long skip(long n):忽略輸入資料流中的n個位元組,傳回值是實際忽略的位元組數, 跳過一些位元組來讀取

(6) public int close( ) :我們在使用完後,必須對我們開啟的流進行關閉.

主要的子類:

1) FileInputStream把一個檔案作為InputStream,實現對檔案的讀取操作

2) ByteArrayInputStream:把記憶體中的一個緩衝區作為InputStream使用

3) StringBufferInputStream:把一個String對象作為InputStream

4) PipedInputStream:實現了pipe的概念,主要線上程中使用

5) SequenceInputStream:把多個InputStream合并為一個InputStream


2.OutputStream抽象類別

OutputStream提供了3個write方法來做資料的輸出,這個是和InputStream是相對應的。

1. public void write(byte b[ ]):將參數b中的位元組寫到輸出資料流。

2. public void write(byte b[ ], int off, int len) :將參數b的從位移量off開始的len個位元組寫到輸出資料流。

3. public abstract void write(int b) :先將int轉換為byte類型,把低位元組寫入到輸出資料流中。

4. public void flush( ) : 將資料緩衝區中資料全部輸出,並清空緩衝區。

5. public void close( ) : 關閉輸出資料流並釋放與流相關的系統資源。

主要的子類:

1) ByteArrayOutputStream:把資訊存入記憶體中的一個緩衝區中

2) FileOutputStream:把資訊存入檔案中

3) PipedOutputStream:實現了pipe的概念,主要線上程中使用

4) SequenceOutputStream:把多個OutStream合并為一個OutStream

流結束的判斷:方法read()的傳回值為-1時;readLine()的傳回值為null時。


3. 檔案輸入資料流: FileInputStream類

FileInputStream可以使用read()方法一次讀入一個位元組,並以int類型返回,或者是使用read()方法時讀入至一個byte數組,byte數組的元素有多少個,就讀入多少個位元組。在將整個檔案讀取完成或寫入完畢的過程中,這麼一個byte數組通常被當作緩衝區,因為這麼一個byte數組通常扮演承接資料的中間角色。

作用:以檔案作為資料輸入源的資料流。或者說是開啟檔案,從檔案讀資料到記憶體的類。

使用方法(1)

File  fin=new File("d:/abc.txt");

FileInputStream in=new FileInputStream( fin);

使用方法(2)

         FileInputStream  in=new  FileInputStream(“d: /abc.txt”);

程式舉例:

將InputFromFile.java的程式的內容顯示在顯示器上
import java.io.IOException; import java.io.FileInputStream; public class TestFile {     public static void main(String args[]) throws IOException {         try {             FileInputStream rf = new FileInputStream("InputFromFile.java");             int n = 512;             byte buffer[] = new byte[n];             while ((rf.read(buffer, 0, n) != -1) && (n > 0)) {                 System.out.println(new String(buffer));             }             System.out.println();             rf.close();         } catch (IOException IOe) {             System.out.println(IOe.toString());         }     }

}  


4.檔案輸出資料流:FileOutputStream類

作用:用來處理以檔案作為資料輸出目的資料流;或者說是從記憶體區讀資料入檔案

FileOutputStream類用來處理以檔案作為資料輸出目的資料流;一個表示檔案名稱的字串,也可以是File或FileDescriptor對象。

建立一個檔案流對象有兩種方法:

方式1:

File   f=new  File (“d:/myjava/write.txt ");

FileOutputStream  out= new FileOutputStream (f);

方式2:

         FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt ");

方式3:建構函式將 FileDescriptor()對象作為其參數。

FileDescriptor() fd=new FileDescriptor();

FileOutputStream f2=new FileOutputStream(fd);

方式4:建構函式將檔案名稱作為其第一參數,將布爾值作為第二參數。

         FileOutputStream f=new FileOutputStream("d:/abc.txt",true);

注意:

(1)檔案中寫資料時,若檔案已經存在,則覆蓋存在的檔案;

(2)讀/寫操作結束時,應調用close方法關閉流。

程式舉例:使用鍵盤輸入一段文章,將文章儲存在檔案write.txt中
import java.io.IOException; import java.io.FileOutputStream; public class TestFile {     public static void main(String args[]) throws IOException {       &nb

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.