1. 程式人生 > >Java輸入輸出流詳解

Java輸入輸出流詳解

通過資料流、序列化和檔案系統提供系統輸入和輸出。

Java把這些不同來源和目標的資料都統一抽象為資料流。Java語言的輸入輸出功能是十分強大而靈活的,美中不足的是看上去輸入輸出的程式碼並不是很簡潔,因為你往往需要包裝許多不同的物件。

在Java類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:標準輸入輸出,檔案的操作,網路上的資料流,字串流,物件流,zip檔案流。

1.1、Java流的分類 按流向分: 輸入流: 程式可以從中讀取資料的流。
輸出流: 程式能向其中寫入資料的流。 按資料傳輸單位分: 位元組流: 以位元組為單位傳輸資料的流
字元流: 以字元為單位傳輸資料的流 按功能分: 節點流: 用於直接操作目標裝置的流
過濾流: 是對一個已存在的流的連結和封裝,通過對資料進行處理為程式提供功能強大、靈活的讀寫功能。 1.2、java.io常用類

JDK所提供的所有流類位於java.io包中,都分別繼承自以下四種抽象流類:

InputStream:繼承自InputStream的流都是用於向程式中輸入資料的,且資料單位都是位元組(8位)。
OutputSteam:繼承自OutputStream的流都是程式用於向外輸出資料的,且資料單位都是位元組(8位)。
Reader:繼承自Reader的流都是用於向程式中輸入資料的,且資料單位都是字元(16位)。
Writer:繼承自Writer的流都是程式用於向外輸出資料的,且資料單位都是字元(16位)。

java語言的輸入輸出功能是十分強大而靈活的,美中不足的是看上去輸入輸出的程式碼並不是很簡潔,因為你往往需要包裝許多不同的物件。在Java類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:標準輸入輸出,檔案的操作,網路上的資料流,字串流,物件流,zip檔案流....本文的目的是為大家做一個簡要的介紹。

  流是一個很形象的概念,當程式需要讀取資料的時候,就會開啟一個通向資料來源的流,這個資料來源可以是檔案,記憶體,或是網路連線。類似的,當程式需要寫入資料的時候,就會開啟一個通向目的地的流。這時候你就可以想象資料好像在這其中“流”動一樣,如下圖:

                            

                                

 Java中的流分為兩種,一種是位元組流,另一種是字元流,分別由四個抽象類來表示(每種流包括輸入和輸出兩種所以一共四個):InputStream,OutputStream,Reader,Writer。Java中其他多種多樣變化的流均是由它們派生出來的:

stream代表的是任何有能力產出資料的資料來源,或是任何有能力接收資料的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括兩種型別:

  (1)位元組流

  表示以位元組為單位從stream中讀取或往stream中寫入資訊,即io包中的inputstream類和outputstream類的派生類。通常用來讀取二進位制資料,如圖象和聲音。

  (2)字元流

  以Unicode字元為導向的stream,表示以Unicode字元為單位從stream中讀取或往stream中寫入資訊。

  區別:

  Reader和Writer要解決的,最主要的問題就是國際化。原先的I/O類庫只支援8位的位元組流,因此不可能很好地處理16位的Unicode字元流。Unicode是國際化的字符集(更何況Java內建的char就是16位的Unicode字元),這樣加了Reader和Writer之後,所有的I/O就都支援Unicode了。此外新類庫的效能也比舊的好。

  但是,Read和Write並不是取代InputStream和OutputStream,有時,你還必須同時使用"基於byte的類"和"基於字元的類"。為此,它還提供了兩個"介面卡(adapter)"類。InputStreamReader負責將InputStream轉化成Reader,而OutputStreamWriter則將OutputStream轉化成Writer。

  一.流的層次結構

  定義:

  (1)       java將讀取資料物件成為輸入流,能向其寫入的物件叫輸出流。結構圖如下:

                                                輸入流

 

                                                 輸出流

 

 二.InputStream類

  inputstream類和outputstream類都為抽象類,不能建立物件,可以通過子類來例項化。

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

  (1)       public abstract int read( ):讀取一個byte的資料,返回值是高位補0的int型別值。

  (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( ) :我們在使用完後,必須對我們開啟的流進行關閉.

  三.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. 上述各方法都有可能引起異常。

  2. InputStream和OutputStream都是抽象類,不能建立這種型別的物件。

  四.FileInputStream類

  FileInputStream類是InputStream類的子類,用來處理以檔案作為資料輸入源的資料流。使用方法:

  方式1:

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

  FileInputStream in=new FileInputStream(fin);

  方式2:

  FileInputStream in=new

  FileInputStream("d: /abc.txt");

  方式3:

  建構函式將 FileDescriptor()物件作為其引數。

  FileDescriptor() fd=new FileDescriptor();

  FileInputStream f2=new FileInputStream(fd);

  五.FileOutputStream類

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

  建立一個檔案流物件有兩種方法:

  方式1:

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

  FileOutputStream out=new FileOutputStream (f);

  方式2:

  FileOutputStream out=new

  FileOutputStream("d:/abc.txt");

  方式3:建構函式將 FileDescriptor()物件作為其引數。

  FileDescriptor() fd=new FileDescriptor();

  FileOutputStream f2=new FileOutputStream(fd);

方式4:建構函式將檔名作為其第一引數,將布林值作為第二引數。

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

  注意:

  (1)檔案中寫資料時,若檔案已經存在,則覆蓋存在的檔案;(2)的讀/寫操作結束時,應呼叫close方法關閉流。

  舉例:2-1

  六.File類

  File類與InputStream / OutputStream類同屬於一個包,它不允許訪問檔案內容。

  File類主要用於命名檔案、查詢檔案屬性和處理檔案目錄。

  舉例:2-2

  七.從一個流構造另一個流

  java的流類提供了結構化方法,如,底層流和高層過濾流。

  而高層流不是從輸入裝置讀取,而是從其他流讀取。同樣高層輸出流也不是寫入輸出裝置,而是寫入其他流。

  使用"分層物件(layered objects)",為單個物件動態地,透明地新增功能的做法,被稱為Decorator Pattern。Decorator模式要求所有包覆在原始物件之外的物件,都必須具有與之完全相同的介面。這使得decorator的用法變得非常的透明--無論物件是否被decorate過,傳給它的訊息總是相同的。這也是Java I/O類庫要有"filter(過濾器)"類的原因:抽象的"filter"類是所有decorator的基類。Decorator模式常用於如下的情形:如果用繼承來解決各種需求的話,類的數量會多到不切實際的地步。Java的I/O類庫需要提供很多功能的組合,於是decorator模式就有了用武之地。

  為InputStream和OutputStream定義decorator類介面的類,分別是FilterInputStream和FilterOutputStream。

 FilterInputStream的種類

 

 

 

 

 

功能

 

 

建構函式的引數

 

 

 

 

用法

 

 

 

 

DataInputStream

 

 

與DataOutputStream配合使用,這樣你就能以一種"可攜帶的方式(portable fashion)"從流裡讀取primitives了(int,char,long等)

 

 

InputStream

 

 

 

 

包含了一整套讀取primitive資料的介面。

 

 

 

 

BufferedInputStream

 

 

用這個類來解決"每次要用資料的時候都要進行物理讀取"的問題。你的意思是"用緩衝區。"

 

 

InputStream,以及可選的緩衝區的容量

 

 

 

 

它本身並不提供介面,只是提供一個緩衝區。需要連到一個"有介面的物件(interface object)"。

 

 

 

 

LineNumberInputStream

 

 

跟蹤輸入流的行號;有getLineNumber( )和setLineNumber(int)方法

 

 

InputStream

 

 

 

 

只是加一個行號,所以還得連一個"有介面的物件"。

 

 

 

 

PushbackInputStream

 

 

有一個"彈壓單位元組"的緩衝區(has a one byte push-back buffer),這樣你就能把最後讀到的那個位元組再壓回去了。

 

 

InputStream

 

 

 

 

主要用於編譯器的掃描程式。可能是為支援Java的編譯器而設計的。用的機會不多。

 

FilterOutputStream的種類

 

 

 

 

 

功能

 

 

建構函式的引數

 

 

 

 

用法

 

 

 

 

DataOutputStream

 

 

與DataInputStream配合使用,這樣你就可以用一種"可攜帶的方式(portable fashion)"往流裡寫primitive了(int, char, long,等)

 

 

OutputStream

 

 

 

 

包括寫入primitive資料的全套介面。

 

 

 

 

PrintStream

 

 

負責生成帶格式的輸出(formatted output)。DataOutputStrem負責資料的儲存,而PrintStream負責資料的顯示。

 

 

一個OutputStream以及一個可選的boolean值。這個boolean值表示,要不要清空換行符後面的緩衝區。

 

 

 

 

應該是OutputStream物件的最終包覆層。用的機會很多。

 

 

 

 

BufferedOutputStream

 

 

用 這個類解決"每次往流裡寫資料,都要進行物理操作"的問題。也就是說"用緩衝區"。用flush( )清空緩衝區。

 

 

OutputStream, 以及一個可選的緩衝區大小

 

 

 

 

本身並不提供介面,只是加了一個緩衝區。需要連結一個有介面的物件。

  DataInputStream類物件可以讀取各種型別的資料。

  DataOutputStream類物件可以寫各種型別的資料;

  建立這兩類物件時,必須使新建立的物件指向建構函式中的引數物件。例如:

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

  DataInputStream din=new DataInputStream(in);

  7.2BufferInputStream和bufferOutputStream

  允許程式在不降低系統性能的情況下一次一個位元組的從流中讀取資料。

  BufferInputstream定義了兩種建構函式

  (1)       BufferInputStream b= new BufferInputstream(in);

  (2)       BufferInputStream b=new BufferInputStream(in,size)

  第二個引數表示指定緩衝器的大小。

  同樣BufferOutputStream也有兩種建構函式。一次一個位元組的向流中寫資料。

  7.3printstream

  用於寫入文字或基本型別

  兩種建構函式方法:

  PrintStream ps=new PrintStream(out);

  PrintStream ps=new PrintStream(out, autoflush)

  第二個引數為布林值,控制每次輸出換行符時java是否重新整理輸出流。

  八.字元流的讀取和寫入

  java.io.Reader 和 java.io.InputStream 組成了 Java 輸入類。Reader 用於讀入16位字元,也就是 Unicode 編碼的字元;而 InputStream 用於讀入 ASCII 字元和二進位制資料。

 

相關推薦

Java輸入輸出2

output put 輸入流 基類 inpu reader 讀取 輸入輸出 NPU InputStream/Reader:所有輸入流的基類,只能從中讀取數據; OutputStream/Writer:所有輸出流的基類,只能向其寫入數據。Java輸入輸出流詳解2

Java輸入輸出

通過資料流、序列化和檔案系統提供系統輸入和輸出。 Java把這些不同來源和目標的資料都統一抽象為資料流。Java語言的輸入輸出功能是十分強大而靈活的,美中不足的是看上去輸入輸出的程式碼並不是很簡潔,因為你往往需要包裝許多不同的物件。 在Java類庫中,IO部分的內容是很龐大的,因為它涉

java 輸入輸出

1.什麼是IO       Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基於資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列。Java的I/O流提供了讀寫資料的標準方法。任何Java中表示

JAVA I/O輸入輸出

以Unicode字元為導向的stream,表示以Unicode字元為單位從stream中讀取或往stream中寫入資訊。 區別: Reader和Writer要解決的,最主要的問題就是國際化。原先的I/O類庫只支援8位的位元組流,因此不可能很好地處理16位的Unicode字元流。Unicode是國際化的字符集(

Java實現檔案寫入——IO輸入輸出

輸入輸出的重要性:      輸入和輸出功能是Java對程式處理資料能力的提高,Java以流的形式處理資料。流是一組有序的資料序列,根據操作的型別,分為輸入流和輸出流。      程式從輸入流讀取資料,向輸出流寫入資料。Java是面向物件的程式語言,每一個數

10.5-全棧Java筆記:常見(三)

java上節我們講到「Java中常用流:緩沖流」,本節我們學習數據流和對象流~ 數據流數據流將“基本數據類型變量”作為數據源,從而允許程序以與機器無關方式從底層輸入輸出流中操作java基本數據類型。 DataInputStream和DataOutputStream提供了可以存取與機器無關的所有Java基礎類

Java輸入輸出(轉載)

字符串數組 三種 dir row 接口 jdk1 end get 繼承 看到一篇超清晰的輸入輸出流文章,就轉載一下,膜拜 http://blog.csdn.net/hguisu/article/details/7418161 1.什麽是IO Java中I/O操作

Java 輸入輸出

red 處理 adl 分享圖片 效率 人的 耗時 buffer IE 這篇不是為了系統介紹Java的輸入輸出流機制的,僅為個人筆記 作為Java小菜,每次上網搜別人的Java讀寫文件的程序參考,總覺得一頭霧水,為什麽要聲明這麽多類,規則是什麽,全然分から

java I/O

practice bubuko put bre 技術分享 writer 多媒體 buffered args 概況 I/O流主要分為二大類別:字符流和字節流。 字節流(基本流) 1、字節輸入流 類名:FileInputStream 特點:讀(對文件進行讀取操作)

Java常用IO

cat exce getpath tst IV trac AC output har 一、流的分類: 按照數據流向的不同:輸入流 輸出流 按照處理數據的單位的不同:字節流 字符流(處理的文本文件) 按照角色的不同:節點流(直接作用於文件的) 處理流 二、IO的體系

Java 輸入/輸出——體系(處理

void dso span style output amt nbsp public 用處   關於使用處理流的優勢,歸納起來就是兩點:(1)對於開發人員來說,使用處理流進行輸入/輸出操作更簡單;(2)使用處理流執行效率更高。   下面程序使用PrintStream處理流來

Java 輸入輸出筆記

流的分類 按流的方向 輸入流     InputStream Reader 輸出流     OutputStream Writer 按資料單元 位元組流     位元組流操作的資料單元是8 位的位元組    二進位制資料    InputStream OutputStream 

Java輸入輸出---面試

目錄和檔案操作 關鍵考點:  File類的概念。  如何用File類看來操作目錄和檔案。 答案: Java提供了java.io.File類對目錄和檔案進行操作。主要的操作方法包括:路徑字串構造方法、isDirectory、isFile、createNew

Java輸入輸出

I/O 流即資料傳輸通道。可以使用這條通道把源中的資料傳送給目標。 把輸入流的指向稱做源。程式通過指向源的輸入流讀取源中的資料。 把輸出流的指向叫做目標。程式通過指向目標的輸出流向目標寫資料。 雖然I/O 流經常與磁碟檔案存取有關。但是程式的源和目的地也可以是鍵盤。滑鼠

JAVA輸入/輸出程式例題(檔案和目錄、位元組、字元

一.檔案和目錄 1.顯示檔案的基本資訊。 2.顯示目錄的基本資訊。 3.在指定目錄下建立單個檔案。 4.指定目錄下建立多個臨時檔案。 二、位元組流 1.生成ZIP壓縮檔案 2.解壓縮zip檔案 3.生成Excel檔案 4.讀取excel檔案 5.生成PDF檔案 6.讀取P

java輸入輸出詳細講解(入門經典),詳細講解JAVA中的IO

今天我們開始進入學習 java 中比較讓人頭疼的事, 那就是 I/O 流、多執行緒、網路程式設計。這裡對 I/O 流的一個詳細講解。希望對大家有點用吧。(不看後悔哦) 一、什麼是IO Java中I/O操作主要是指使用Java進行輸入,輸出操作。 Java所有的I/O機制都是基於資料流進行輸入

Java 輸入/輸出

1. 編碼問題 在介紹輸入輸出之前我們先介紹下關於編碼的一些基本知識點,當一個檔案中既有中文字元又有英文字元時,他們在不同的編碼方式下會佔據不同的記憶體: 1. ANSI 中文佔據 2 個位元組的記憶體空間,英文佔據 1 個位元組的記憶體空間。 2. GB

java實驗8-Java輸入輸出

1 讀寫檔案 【實驗目的】 (1)掌握文字檔案的讀寫方法。 (2)掌握隨機檔案的讀寫方法。 (3)掌握InputStream、OutputStream抽象類的基本使用。 (4)掌握FileInputStream、FileOutputStream、DataInputStrea

Java輸入輸出(I/O)

第十四天: 目標: ------------------------------------------------------------ 第十四章  Stream I/O and Files, 共 44 個slide(411-455); 知識點:一. 流的概念    

java 輸入輸出和File簡單解析(附android中文亂碼問題解決)

java的輸入輸出流是用來幹甚麼的?以下來自百度。點選開啟連結 現在只有檔案輸出輸出流和File的簡單應用,以後再補 輸入輸出不是對機器而言的 輸入輸出是相對於程式來說的。程式執行時是在記憶體中的 輸入是指將硬碟或其他儲存裝置的資料讀入記憶體 輸出是指將記憶體中的資料寫入