JAVA-IO詳解 



一. Input和Output

  1. stream代表的是任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源,或是任何有能力接收數(shù)據(jù)的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括兩種類型:



 1.1 以字節(jié)為導(dǎo)向的stream

  以字節(jié)為導(dǎo)向的stream,表示以字節(jié)為單位從stream中讀取或往stream中寫入信息。以字節(jié)為導(dǎo)向的stream  包括下面幾種類型:
  1) input stream:
  1) ByteArrayInputStream:把內(nèi)存中的一個(gè)緩沖區(qū)作為InputStream使用
  2) StringBufferInputStream:把一個(gè)String對象作為InputStream
  3) FileInputStream:把一個(gè)文件作為InputStream,實(shí)現(xiàn)對文件的讀取操作
  4) PipedInputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用
  5) SequenceInputStream:把多個(gè)InputStream合并為一個(gè)InputStream
  2) Out stream
  1) ByteArrayOutputStream:把信息存入內(nèi)存中的一個(gè)緩沖區(qū)中
  2) FileOutputStream:把信息存入文件中
  3) PipedOutputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用
  4) SequenceOutputStream:把多個(gè)OutStream合并為一個(gè)OutStream

  1.2 以Unicode字符為導(dǎo)向的stream

  以Unicode字符為導(dǎo)向的stream,表示以Unicode字符為單位從stream中讀取或往stream中寫入信息。以   Unicode字符為導(dǎo)向的stream包括下面幾種類型:
 1) Input Stream
  1) CharArrayReader:與ByteArrayInputStream對應(yīng)
  2) StringReader:與StringBufferInputStream對應(yīng)
  3) FileReader:與FileInputStream對應(yīng)
  4) PipedReader:與PipedInputStream對應(yīng)
  2) Out Stream
  1) CharArrayWrite:與ByteArrayOutputStream對應(yīng)
  2) StringWrite:無與之對應(yīng)的以字節(jié)為導(dǎo)向的stream
  3) FileWrite:與FileOutputStream對應(yīng)
  4) PipedWrite:與PipedOutputStream對應(yīng)

   以字符為導(dǎo)向的stream基本上對有與之相對應(yīng)的以字節(jié)為導(dǎo)向的stream。兩個(gè)對應(yīng)類實(shí)現(xiàn)的功能相同,字是在操作時(shí)的導(dǎo)向不同。如 CharArrayReader:和ByteArrayInputStream的作用都是把內(nèi)存中的一個(gè)緩沖區(qū)作為InputStream使用,所不同的 是前者每次從內(nèi)存中讀取一個(gè)字節(jié)的信息,而后者每次從內(nèi)存中讀取一個(gè)字符。

  1.3 兩種不現(xiàn)導(dǎo)向的stream之間的轉(zhuǎn)換

  InputStreamReader和OutputStreamReader:把一個(gè)以字節(jié)為導(dǎo)向的stream轉(zhuǎn)換成一個(gè)以字符為導(dǎo)向的stream。

  2. stream添加屬性

  2.1 “為stream添加屬性”的作用

  運(yùn)用上面介紹的Java中操作IO的API,我們就可完成我們想完成的任何操作了。但通過FilterInputStream和FilterOutStream的子類,我們可以為stream添加屬性。下面以一個(gè)例子來說明這種功能的作用。
如果我們要往一個(gè)文件中寫入數(shù)據(jù),我們可以這樣操作:

 
 FileOutStream fs = new FileOutStream(“test.txt”);
 



   然后就可以通過產(chǎn)生的fs對象調(diào)用write()函數(shù)來往test.txt文件中寫入數(shù)據(jù)了。但是,如果我們想實(shí)現(xiàn)“先把要寫入文件的數(shù)據(jù)先緩存到內(nèi)存 中,再把緩存中的數(shù)據(jù)寫入文件中”的功能時(shí),上面的API就沒有一個(gè)能滿足我們的需求了。但是通過FilterInputStream和 FilterOutStream的子類,為FileOutStream添加我們所需要的功能。
  2.2 FilterInputStream的各種類型





***

*** 


  2.2.1 用于封裝以字節(jié)為導(dǎo)向的InputStream
 
  1) DataInputStream:從stream中讀取基本類型(int、char等)數(shù)據(jù)。
  2) BufferedInputStream:使用緩沖區(qū)
  3) LineNumberInputStream:會(huì)記錄input stream內(nèi)的行數(shù),然后可以調(diào)用getLineNumber()和setLineNumber(int)
  4) PushbackInputStream:很少用到,一般用于編譯器開發(fā)

  2.2.2 用于封裝以字符為導(dǎo)向的InputStream

  1) 沒有與DataInputStream對應(yīng)的類。除非在要使用readLine()時(shí)改用BufferedReader,否則使用DataInputStream



作者: 222.67.6.*  2007-2-7 07:49   回復(fù)此發(fā)言  


2 java io

  2) BufferedReader:與BufferedInputStream對應(yīng)
  3) LineNumberReader:與LineNumberInputStream對應(yīng)
  4) PushBackReader:與PushbackInputStream對應(yīng)

  2.3 FilterOutStream的各種類型

  2.2.3 用于封裝以字節(jié)為導(dǎo)向的OutputStream

  1) DataIOutStream:往stream中輸出基本類型(int、char等)數(shù)據(jù)。
  2) BufferedOutStream:使用緩沖區(qū)
  3) PrintStream:產(chǎn)生格式化輸出
  2.2.4 用于封裝以字符為導(dǎo)向的OutputStream

  1) BufferedWrite:與對應(yīng)
  2) PrintWrite:與對應(yīng)
  3. RandomAccessFile
  1) 可通過RandomAccessFile對象完成對文件的讀寫操作
  2) 在產(chǎn)生一個(gè)對象時(shí),可指明要打開的文件的性質(zhì):r,只讀;w,只寫;rw可讀寫
  3) 可以直接跳到文件中指定的位置


 
什么是IO 
--------------------------------------------------------------------------------
IO(Input/Output)是計(jì)算機(jī)輸出/輸出的接口。Java的核心庫java.io提供了全面的IO接口,包括:文件讀寫,標(biāo)準(zhǔn)設(shè)備輸出等 等。Java中IO是以流為基礎(chǔ)進(jìn)行輸入輸出的,所有數(shù)據(jù)被串行化寫入輸出流,或者從輸入流讀入。此外,Java也對塊傳輸提供支持,在核心庫 java.nio中采用的便是塊IO。關(guān)于NIO我們在后面還有專門的討論。
  流IO的好處是簡單易用,缺點(diǎn)是效率較低。塊IO效率很高,但編程比較復(fù)雜。

Java IO模型 
--------------------------------------------------------------------------------
Java的IO模型設(shè)計(jì)非常優(yōu)秀,它使用Decorator模式,按功能劃分Stream,您可以動(dòng)態(tài)裝配這些Stream,以便獲得您需要的功能。例 如,您需要一個(gè)具有緩沖的文件輸入流,則應(yīng)當(dāng)組合使用FileInputStream和BufferedInputStream。
  Java的IO體系分Input/Output和Reader/Writer兩類,區(qū)別在于Reader/Writer在讀寫文本時(shí)能自動(dòng)轉(zhuǎn)換內(nèi)碼?;旧?,所有的IO類都是配對的,即有XxxInput就有一個(gè)對應(yīng)的XxxOutput。

Java IO教程 
--------------------------------------------------------------------------------
如果您對Decorator模式非常了解,就能輕易地看出Java的IO類結(jié)構(gòu):根接口是InputStream/OutputStream,充當(dāng)數(shù)據(jù) 源的IO類有FileInputStream/FileOutputStream, ByteArrayInputStream/ByteArrayOutputStream等,充當(dāng)裝飾功能的IO類有 BufferedInputStream/BufferedOutputStream, DataInputStream/DataOutputStream等,它們都是繼承裝飾接口 FilterInputStream/FilterOutputStream。使用IO時(shí),首先創(chuàng)建一個(gè)數(shù)據(jù)源IO,然后根據(jù)需要的功能創(chuàng)建裝飾類IO, 其構(gòu)造函數(shù)的參數(shù)為已創(chuàng)建的數(shù)據(jù)源IO。我們以創(chuàng)建一個(gè)具有緩沖的文件輸入流為例,假定需要從磁盤讀取文件“C:\log.txt”:
// 創(chuàng)建一個(gè)FileInputStream:
FileInputStream fileInput = new FileInputStream("C:\\log.txt"); 
// 創(chuàng)建一個(gè)BufferedInputStream:
BufferedInputStream bufferedInput = new BufferedInputStream(fileInput); 
// 現(xiàn)在得到的bufferedInput即是具有緩沖的文件輸入流 
  或者進(jìn)一步簡寫如下:
InputStream input = new BufferedInputStream(
new FileInputStream("C:\\log.txt"));
// 現(xiàn)在得到的input即是具有緩沖的文件輸入流 
  在您對Java的IO有了總體了解后,我們推薦您看看教程Introduction to Java I/O和I/O: Reading and Writing。




作者: 222.67.6.*  2007-2-7 07:49   回復(fù)此發(fā)言  


3 回復(fù):java io

java io 總結(jié)

java中的io系統(tǒng)總結(jié).

java中的io中的(input/output)stream無非就是包括基于字符的stream、基于字節(jié)的stream和把字節(jié)導(dǎo)向的stream轉(zhuǎn)換
字符為導(dǎo)向的stream的stream。(很難理解么?)
以字節(jié)為導(dǎo)向的stream------InputStream/OutputStream
InputStream 和 OutputStream是兩個(gè)abstact類,對于字節(jié)為導(dǎo)向的stream都擴(kuò)展這兩個(gè)雞肋(基類^_^);
--InputStream
ByteArrayInputStream -- 把內(nèi)存中的一個(gè)緩沖區(qū)作為InputStream使用.

construct---ByteArrayInputStream(byte[])創(chuàng)建一個(gè)新字節(jié)數(shù)組輸入流,它從指定字節(jié)數(shù)組中讀取數(shù)據(jù)。
---ByteArrayInputStream(byte[], int, int) 創(chuàng)建一個(gè)新字節(jié)數(shù)組輸入流,它從指定字節(jié)數(shù)組中讀取數(shù)據(jù)。
---mark::該字節(jié)數(shù)組未被復(fù)制。

StringBufferInputStream -- 把一個(gè)String對象作為InputStream .
注釋:不推薦使用 StringBufferInputStream 方法。 此類不能將字符正確的轉(zhuǎn)換為字節(jié)。
同 JDK 1.1 版中的類似,從一個(gè)串創(chuàng)建一個(gè)流的最佳方法是采用 StringReader 類。 

construct---StringBufferInputStream(String) 據(jù)指定串創(chuàng)建一個(gè)讀取數(shù)據(jù)的輸入流串。

FileInputStream -- 把一個(gè)文件作為InputStream,實(shí)現(xiàn)對文件的讀取操作 

construct---FileInputStream(File) 創(chuàng)建一個(gè)輸入文件流,從指定的 File 對象讀取數(shù)據(jù)。
---FileInputStream(FileDescriptor) 創(chuàng)建一個(gè)輸入文件流,從指定的文件描述器讀取數(shù)據(jù)。
---FileInputStream(String) 創(chuàng)建一個(gè)輸入文件流,從指定名稱的文件讀取數(shù)據(jù)。

method ---- read() 從當(dāng)前輸入流中讀取一字節(jié)數(shù)據(jù)。 
read(byte[]) 將當(dāng)前輸入流中 b.length 個(gè)字節(jié)數(shù)據(jù)讀到一個(gè)字節(jié)數(shù)組中。 
read(byte[], int, int) 將輸入流中 len 個(gè)字節(jié)數(shù)據(jù)讀入一個(gè)字節(jié)數(shù)組中。

PipedInputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用. 管道輸入流是指一個(gè)通訊管道的接收端。
一個(gè)線程通過管道輸出流發(fā)送數(shù)據(jù),而另一個(gè)線程通過管道輸入流讀取數(shù)據(jù),
這樣可實(shí)現(xiàn)兩個(gè)線程間的通訊。

PipedInputStream() 創(chuàng)建一個(gè)管道輸入流,它還未與一個(gè)管道輸出流連接。 
PipedInputStream(PipedOutputStream) 創(chuàng)建一個(gè)管道輸入流, 它已連接到一個(gè)管道輸出流。 

SequenceInputStream:把多個(gè)InputStream合并為一個(gè)InputStream .“序列輸入流”類允許應(yīng)用程序把幾個(gè)輸入流連續(xù)地合并起來,
并且使它們像單個(gè)輸入流一樣出現(xiàn)。每個(gè)輸入流依次被讀取,直到到達(dá)該流的末尾。
然后“序列輸入流”類關(guān)閉這個(gè)流并自動(dòng)地切換到下一個(gè)輸入流。 
SequenceInputStream(Enumeration) 創(chuàng)建一個(gè)新的序列輸入流,并用指定的輸入流的枚舉值初始化它。 
SequenceInputStream(InputStream, InputStream) 創(chuàng)建一個(gè)新的序列輸入流,初始化為首先 讀輸入流 s1, 然后讀輸入流 s2。

--OutputSteam

ByteArrayOutputStream:把信息存入內(nèi)存中的一個(gè)緩沖區(qū)中.該類實(shí)現(xiàn)一個(gè)以字節(jié)數(shù)組形式寫入數(shù)據(jù)的輸出流。
當(dāng)數(shù)據(jù)寫入緩沖區(qū)時(shí),它自動(dòng)擴(kuò)大。用 toByteArray() 和 toString() 能檢索數(shù)據(jù)。 

construct --- ByteArrayOutputStream() 創(chuàng)建一個(gè)新的字節(jié)數(shù)組輸出流。
--- ByteArrayOutputStream() 創(chuàng)建一個(gè)新的字節(jié)數(shù)組輸出流。 
--- ByteArrayOutputStream(int) 創(chuàng)建一個(gè)新的字節(jié)數(shù)組輸出流,并帶有指定大小字節(jié)的緩沖區(qū)容量。 
toString(String) 根據(jù)指定字符編碼將緩沖區(qū)內(nèi)容轉(zhuǎn)換為字符串,并將字節(jié)轉(zhuǎn)換為字符。 
write(byte[], int, int) 將指定字節(jié)數(shù)組中從偏移量 off 開始的 len 個(gè)字節(jié)寫入該字節(jié)數(shù)組輸出流。 
write(int) 將指定字節(jié)寫入該字節(jié)數(shù)組輸出流。 
writeTo(OutputStream) 用 out.write(buf, 0, count) 調(diào)用輸出流的寫方法將該字節(jié)數(shù)組輸出流的全部內(nèi)容寫入指定的輸出流參數(shù)。 

FileOutputStream:文件輸出流是向 File 或 FileDescriptor 輸出數(shù)據(jù)的一個(gè)輸出流。



作者: 222.67.6.*  2007-2-8 07:40   回復(fù)此發(fā)言  


4 回復(fù):java io


FileOutputStream(File) 創(chuàng)建一個(gè)文件輸出流,向指定的 File 對象輸出數(shù)據(jù)。 
FileOutputStream(FileDescriptor) 創(chuàng)建一個(gè)文件輸出流,向指定的文件描述器輸出數(shù)據(jù)。 
FileOutputStream(String) 創(chuàng)建一個(gè)文件輸出流,向指定名稱的文件輸出數(shù)據(jù)。 
FileOutputStream(String, boolean) 用指定系統(tǒng)的文件名,創(chuàng)建一個(gè)輸出文件。

PipedOutputStream:管道輸出流是指一個(gè)通訊管道的發(fā)送端。 一個(gè)線程通過管道輸出流發(fā)送數(shù)據(jù),
而另一個(gè)線程通過管道輸入流讀取數(shù)據(jù),這樣可實(shí)現(xiàn)兩個(gè)線程間的通訊。

PipedOutputStream() 創(chuàng)建一個(gè)管道輸出流,它還未與一個(gè)管道輸入流連接。 
PipedOutputStream(PipedInputStream) 創(chuàng)建一個(gè)管道輸出流,它已連接到一個(gè)管道輸入流。


以字符為導(dǎo)向的stream Reader/Writer

以Unicode字符為導(dǎo)向的stream,表示以Unicode字符為單位從stream中讀取或往stream 中寫入信息。
Reader/Writer 為abstact類
以Unicode字符為導(dǎo)向的stream包括下面幾種類型: 

-- Reader

1) CharArrayReader:與ByteArrayInputStream對應(yīng) 
CharArrayReader(char[]) 用指定字符數(shù)組創(chuàng)建一個(gè) CharArrayReader。
CharArrayReader(char[], int, int) 用指定字符數(shù)組創(chuàng)建一個(gè) CharArrayReader。

2) StringReader:與StringBufferInputStream對應(yīng) 
StringReader(String) 創(chuàng)建一新的串讀取者。
3) FileReader:與FileInputStream對應(yīng) 

4) PipedReader:與PipedInputStream對應(yīng) 

-- Writer

1) CharArrayWrite:與ByteArrayOutputStream對應(yīng) 
2) StringWrite:無與之對應(yīng)的以字節(jié)為導(dǎo)向的stream 
3) FileWrite:與FileOutputStream對應(yīng) 
4) PipedWrite:與PipedOutputStream對應(yīng) 

兩種不現(xiàn)導(dǎo)向的stream之間的轉(zhuǎn)換
InputStreamReader和OutputStreamReader:把一個(gè)以字節(jié)為導(dǎo)向的stream轉(zhuǎn)換成一個(gè)以字符為導(dǎo)向的stream。
一個(gè) InputStreamReader 類是從字節(jié)流到字符流的橋梁:它讀入字節(jié),并根據(jù)指定的編碼方式,將之轉(zhuǎn)換為字符流。
使用的編碼方式可能由名稱指定,或平臺(tái)可接受的缺省編碼方式。

InputStreamReader 的 read() 方法之一的每次調(diào)用,可能促使從基本字節(jié)輸入流中讀取一個(gè)或多個(gè)字節(jié)。
為了達(dá)到更高效率,考慮用 BufferedReader 封裝 InputStreamReader,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

InputStreamReader(InputStream) 用缺省的字符編碼方式,創(chuàng)建一個(gè) InputStreamReader。 
InputStreamReader(InputStream, String) 用已命名的字符編碼方式,創(chuàng)建一個(gè) InputStreamReader。

OutputStreamWriter 將多個(gè)字符寫入到一個(gè)輸出流,根據(jù)指定的字符編碼將多個(gè)字符轉(zhuǎn)換為字節(jié)。 
每個(gè) OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是從字符流到字節(jié)流的橋梁。

FilterInputStream、RandomAccessFile 見例子。
ObjectInputStream 、 ObjectOutputStream見另外blog。


Java IO的一般使用原則:

一、按數(shù)據(jù)來源(去向)分類:
1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、是Char[]: CharArrayReader, CharArrayWriter
4、是String: StringBufferInputStream, StringReader, StringWriter
5、網(wǎng)絡(luò)數(shù)據(jù)流:InputStream, OutputStream, Reader, Writer

二、按是否格式化輸出分:
1、要格式化輸出:PrintStream, PrintWriter

三、按是否要緩沖分:
1、要緩沖:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter

四、按數(shù)據(jù)格式分:
1、二進(jìn)制格式(只要不能確定是純文本的): InputStream, OutputStream及其所有帶Stream結(jié)束的子類
2、純文本格式(含純英文與漢字或其他編碼方式);Reader, Writer及其所有帶Reader, Writer的子類

五、按輸入輸出分:
1、輸入:Reader, InputStream類型的子類
2、輸出:Writer, OutputStream類型的子類

六、特殊需要:
1、從Stream到Reader,Writer的轉(zhuǎn)換類:InputStreamReader, OutputStreamWriter
2、對象輸入輸出:ObjectInputStream, ObjectOutputStream
3、進(jìn)程間通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4、合并輸入:SequenceInputStream
5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

決定使用哪個(gè)類以及它的構(gòu)造進(jìn)程的一般準(zhǔn)則如下(不考慮特殊需要):
首先,考慮最原始的數(shù)據(jù)格式是什么: 原則四
第二,是輸入還是輸出:原則五
第三,是否需要轉(zhuǎn)換流:原則六第1點(diǎn)
第四,數(shù)據(jù)來源(去向)是什么:原則一
第五,是否要緩沖:原則三 (特別注明:一定要注意的是readLine()是否有定義,有什么比read, write更特殊的輸入或輸出方法)
第六,是否要格式化輸出:原則二



作者: 222.67.6.*  2007-2-8 07:40   回復(fù)此發(fā)言  


5 回復(fù):java io

使用Java 輸出/輸出流讀寫數(shù)據(jù) 

Java  輸入/輸出(I/O)機(jī)制提供了一套簡單的,標(biāo)準(zhǔn)化的API以便從不同的數(shù)據(jù)源讀取和寫入字符和字節(jié)數(shù)據(jù)。在“面向?qū)ο缶幊蹋? Java collection更有效管理elements”一文中,我們討論了Java 集合類架構(gòu)中的類和功能并介紹了它的排序功能。在本文中,我們 將學(xué)習(xí)Java 平臺(tái)提供的這些I/O類,接口和操作。讓我們先從了解Java 數(shù)據(jù)流開始。 
數(shù)據(jù)流
 
Java所有的I/O機(jī)制都是基于數(shù)據(jù)流的,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動(dòng)序列。Java的I/O流提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法。任何Java中表示數(shù)據(jù)源的對象都會(huì)提供以數(shù)據(jù)流的方式讀寫它的數(shù)據(jù)的方法。 

Java.io是大多數(shù)面向數(shù)據(jù)流的輸入/輸出類的主要軟件包。這個(gè)軟件包包含了兩個(gè)抽象類,InputStream和OutputStream。所有其它面象數(shù)據(jù)流的輸入/輸出類都要擴(kuò)展這兩個(gè)基類。 

java.io 軟件包提供了一些類和接口,它們在由InputStream和OuputStream類提供的讀寫操作的頂端定義了一些有用的抽象。例如, ObjectInputStream類提供了讓你把輸入/輸出流中的數(shù)據(jù)當(dāng)成對象來讀取的方法,而ObjectOutputStream類提供了讓你能夠 把Java對象寫入數(shù)據(jù)流中的方法。 

優(yōu)化讀寫過程
JDK 1.1 增加了一套讀寫類,它們提供了比現(xiàn)有數(shù)據(jù)流類更有用的 抽象和更好的輸入/輸出性能。例如,BufferedReader和BufferedWriter 類被用來從基于字符的輸入和輸出流中讀取和寫入文本。 BufferdReader 類緩存字符以更高效的讀取字符串,數(shù)組和文本行。BufferedWriter類緩存字符以更高效的寫入字符串,數(shù)組和文本 行。BufferedReader和BufferedWriter 類可以按需求進(jìn)行設(shè)置。 

Java輸入/輸出架構(gòu)提供的讀取器和 寫入器類包括 LineNumberReader 類,CharArrayReader類,F(xiàn)ileReader類,F(xiàn)ilterReader類, PushbackReader類,PipedReader類,StringReader類以及其它一些類。這些類是在InputStream和 OuputStream類頂部的包裹類因此提供了與InputStream和OuputStream類相似的方法。但是,這些類為讀寫特定的對象,比方文 件,字符數(shù)組和字符串等等提供了更高效而有用的抽象。 

讀取數(shù)據(jù)
當(dāng)你從一個(gè)相應(yīng)的數(shù)據(jù)源對象里提取輸入流或者是創(chuàng)建一個(gè)讀取器對象的時(shí)候就會(huì)自動(dòng)打開一個(gè)輸入流。例如,要為一個(gè)文件打開輸入流,我們只需要以下面的方式把文件名傳遞給Java.io.FileReader對象的構(gòu)造函數(shù): 

java.io.FileReader fileReader = new java.io.FileReader("/home/me/myfile.txt"); 

要按順序讀取FileReader底層的輸入流中的一個(gè)字節(jié)數(shù)據(jù),只需要使用不帶參數(shù)的read方法。表A中的代碼段從一個(gè)文件讀取文本數(shù)據(jù),一次一個(gè)字符,然后把它寫入System.out里。 

要從輸入流讀取指定數(shù)目的字節(jié)數(shù)據(jù)到char數(shù)組里,只需要使用帶一個(gè)char[]參數(shù)的read方法。數(shù)組的長度被用來確定應(yīng)該讀取的字符的個(gè)數(shù)。表B演示了這個(gè)技術(shù)。 

要關(guān)閉一個(gè)輸入流以及這個(gè)流使用的所有系統(tǒng)資源,你只需要以下面的方式調(diào)用close方法: 

fileReader.close(); 

寫入數(shù)據(jù)
象一個(gè)輸入流一樣,輸出流通常在你從相應(yīng)的數(shù)據(jù)源提取它或者是在你創(chuàng)建一個(gè)寫入對象的時(shí)候被自動(dòng)的打開。例如,要為一個(gè)文件打開輸出流,我們把文件的名字傳遞給java.io.FileWriter對象的構(gòu)造函數(shù),如下所示: 

java.io.FileWriter fileWriter = new 
java.io.FileWriter("/home/me/out.txt"); 

要將一個(gè)特定的字符寫入到輸出流中,可以使用帶一個(gè)int參數(shù)的write方法,int參數(shù)代表要定入的字符。 

int aChar = (int)'X'; 
fileWriter.write(aChar); 

要在輸出流給定的偏移地址寫入一個(gè)char數(shù)組中特定數(shù)目的字符,你可以使用帶一個(gè)char[]參數(shù),一個(gè)int 偏移量參數(shù)和一個(gè)int長度參數(shù)的write方法,如下面的例子所示: 

fileWriter.write(buffer, 0, byteCount); 

要關(guān)閉一個(gè)輸出流并釋放所有與之相關(guān)的系統(tǒng)資源,可以使用close方法,就象這樣: 

fileWriter.close(); 

要強(qiáng)迫寫出一個(gè)輸出流中的所有數(shù)據(jù),可以使用下面的flush方法: 

fileWriter.flush(); 

把它們?nèi)烤C合起來
我們可以使用我們學(xué)習(xí)過的這些函數(shù)從一個(gè)文件中讀取數(shù)據(jù)并同時(shí)寫到另一個(gè)文件中去,如表C所示。 

總結(jié)
Java的輸入/輸出機(jī)制為從不同的數(shù)據(jù)源讀取和寫入字符增加了一套簡單而標(biāo)準(zhǔn)化的API。你對一種數(shù)據(jù)源使用Java流的經(jīng)驗(yàn)?zāi)軌蜃屇闳菀椎氖褂闷渌蒍ava提供的數(shù)據(jù)源類型。 

在我們下一篇文章中,我們將會(huì)開始學(xué)習(xí)Java平臺(tái)的聯(lián)網(wǎng)和遠(yuǎn)程通訊架構(gòu)。我們將會(huì)把我們對Java流的討論擴(kuò)展到這些環(huán)境并演示如何打開遠(yuǎn)程數(shù)據(jù)源,并象操作本地?cái)?shù)據(jù)源,比方文件一樣,寫入數(shù)據(jù)和讀取數(shù)據(jù)



作者: 222.67.6.*  2007-2-8 07:42   回復(fù)此發(fā)言  


6 回復(fù):java io

字符流的處理

  java中提供了處理以16位的Unicode碼表示的字符流的類,即以Reader和Writer 為基類派生出的一系列類。

Reader和Writer 

 

  這兩個(gè)類是抽象類,只是提供了一系列用于字符流處理的接口,不能生成這兩個(gè)類的實(shí)例,只能通過使用由它們派生出來的子類對象來處理字符流。

 1.Reader類是處理所有字符流輸入類的父類。

  ◇ 讀取字符
  public int read() throws IOException; //讀取一個(gè)字符,返回值為讀取的字符
  public int read(char cbuf[]) throws IOException; /*讀取一系列字符到數(shù)組cbuf[]中,返回值為實(shí)際讀取的字符的數(shù)量*/
  public abstract int read(char cbuf[],int off,int len) throws IOException;
  /*讀取len個(gè)字符,從數(shù)組cbuf[]的下標(biāo)off處開始存放,返回值為實(shí)際讀取的字符數(shù)量,該方法必須由子類實(shí)現(xiàn)*/

  ◇ 標(biāo)記流
  public boolean markSupported(); //判斷當(dāng)前流是否支持做標(biāo)記
  public void mark(int readAheadLimit) throws IOException;
   //給當(dāng)前流作標(biāo)記,最多支持readAheadLimit個(gè)字符的回溯。
  public void reset() throws IOException; //將當(dāng)前流重置到做標(biāo)記處

  ◇ 關(guān)閉流
  public abstract void close() throws IOException;

 2. Writer類是處理所有字符流輸出類的父類。

  ◇ 向輸出流寫入字符
  public void write(int c) throws IOException;
  //將整型值c的低16位寫入輸出流
  public void write(char cbuf[]) throws IOException;
  //將字符數(shù)組cbuf[]寫入輸出流
  public abstract void write(char cbuf[],int off,int len) throws IOException;
  //將字符數(shù)組cbuf[]中的從索引為off的位置處開始的len個(gè)字符寫入輸出流
  public void write(String str) throws IOException;
  //將字符串str中的字符寫入輸出流
  public void write(String str,int off,int len) throws IOException;
  //將字符串str 中從索引off開始處的len個(gè)字符寫入輸出流

  ◇ flush( )
  刷空輸出流,并輸出所有被緩存的字節(jié)。

  ◇ 關(guān)閉流
  public abstract void close() throws IOException

InputStreamReader和OutputStreamWriter

  java.io包中用于處理字符流的最基本的類,用來在字節(jié)流和字符流之間作為中介。 
  ◇ 生成流對象
  public InputStreamReader(InputStream in); 
  /*in是字節(jié)流,而InputStreamReader是字符流,但是其來源是字節(jié)流in,
  因此InputStreamReader就可以把字節(jié)流in轉(zhuǎn)換成字符流處理。/*

  public InputStreamReader(InputStream in,String enc) throws UnsupportedEncodingException;
  /*enc是編碼方式,就是從字節(jié)流到字符流進(jìn)行轉(zhuǎn)換時(shí)所采用的編碼方式,
   例如 ISO8859-1,UTF-8,UTF-16等等*/

  public OutputStreamWriter(OutputStream out);
  /*out是字節(jié)流,而OutputStreamReader是字符流 */

  public OutputStreamWriter(OutputStream out,String enc) throws UnsupportedEncodingException; //enc是編碼方式

  InputStreamReader和OutputStreamWriter的方法:

  ◇ 讀入和寫出字符
  基本同Reader和Writer。

  ◇ 獲取當(dāng)前編碼方式
  public String getEncoding();

  ◇ 關(guān)閉流
  public void close() throws IOException; 

 

BufferedReader和BufferedWriter 

 

 ◇ 生成流對象

  public BufferedReader(Reader in); //使用缺省的緩沖區(qū)大小
  public BufferedReader(Reader in, int sz); //sz為緩沖區(qū)的大小
  public BufferedWriter(Writer out);
  public BufferedWriter(Writer out, int sz);

 ◇ 讀入/寫出字符

  除了Reader和Writer中提供的基本的讀寫方法外,增加對整行字符的處理。
  public String readLine() throws IOException; //讀一行字符
  public void newLine() throws IOException; //寫一行字符

 import java.io.*;
  public class NumberInput{
   public static void main(String args[]){
    try{
      InputStreamReader ir;
      BufferedReader in;
      ir=new InputStreamReader(System.in);
      //從鍵盤接收了一個(gè)字符串的輸入,并創(chuàng)建了一個(gè)字符輸入流的對象
      in=new BufferedReader(ir);
      String s=in.readLine();
      //從輸入流in中讀入一行,并將讀取的值賦值給字符串變量s
      System.out.println("Input value is: "+s);
      int i = Integer.parseInt(s);//轉(zhuǎn)換成int型
      i*=2;
      System.out.println("Input value changed after doubled: "+i);
    }catch(IOException e)
    {System.out.println(e);}
   }
  }

    運(yùn)行結(jié)果 


D:\>java NumberInput
123
Input value is 123
Input value changed after doubled: 246 


 注意:在讀取字符流時(shí),如果不是來自于本地的,比如說來自于網(wǎng)絡(luò)上某處的與本地編碼方式不同的機(jī)器,那么我們在構(gòu)造輸入流時(shí)就不能簡單地使用本地缺省的編碼方式,否則讀出的字符就不正確;為了正確地讀出異種機(jī)上的字符,我們應(yīng)該使用下述方式構(gòu)造輸入流對象:
  
    ir = new InputStreamReader(is, "8859_1");

  采用ISO 8859_1編碼方式,這是一種映射到ASCII碼的編碼方式,可以在不同平臺(tái)之間正確轉(zhuǎn)換字符。



作者: 222.67.6.*  2007-2-8 07:44   回復(fù)此發(fā)言  


7 回復(fù):java io

JAVA IO

流一般分為輸入流(Input Stream)和輸出流(Output Stream)兩類,但這種劃分并不是絕對的。比如一個(gè)文件,當(dāng)向其中寫數(shù)據(jù)時(shí),它就是一個(gè)輸出流;當(dāng)從其中讀取數(shù)據(jù)時(shí),它就是一個(gè)輸入流.

字節(jié)流:
  從InputStream和OutputStream派生出來的一系列類。這類流以字節(jié)(byte)為基本處理單位。

字符流:
  從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼表示的字符為基本處理單位.

Reader類和Writer類 
前 面說過,在JDK1.1之前,java.io包中的流只有普通的字節(jié)流(以byte為基本處理單位的流),這種流對于以16位的Unicode碼表示的字 符流處理很不方便。從JDK1.1開始, java.io包中加入了專門用于字符流處理的類,它們是以Reader和Writer為基礎(chǔ)派生的一系列類
同類InputStream和OutputStream一樣,Reader和Writer也是抽象類,只提供了一系列用于字符流處理的接口。它們的方法與類InputStream和OutputStream類似,只不過其中的參數(shù)換成字符或字符數(shù)組



作者: 222.67.6.*  2007-2-8 07:44   回復(fù)此發(fā)言  


8 回復(fù):java io

java class diagram

貼子相關(guān)圖片:

作者: 222.67.6.*  2007-2-8 07:54   回復(fù)此發(fā)言  


9 回復(fù):java io

java將讀取數(shù)據(jù)對象成為輸入流,能向其寫入的對象叫輸出流。結(jié)構(gòu)圖如下:輸入流:

貼子相關(guān)圖片:

作者: 222.67.6.*  2007-2-8 07:55   回復(fù)此發(fā)言  


10 回復(fù):java io

Reader的體系結(jié)構(gòu)

貼子相關(guān)圖片:

作者: 222.67.6.*  2007-2-8 07:56   回復(fù)此發(fā)言  


11 回復(fù):java io

Writer類體系結(jié)構(gòu)

貼子相關(guān)圖片:

作者: 222.67.6.*  2007-2-8 07:56   回復(fù)此發(fā)言  


12 回復(fù):java io

Introducing I/O
Input and output, I/O for short, are fundamental to any computer operating system or programming language. Only theorists find it interesting to write programs that don't require input or produce output. At the same time, I/O hardly qualifies as one of the more "thrilling" topics in computer science. It's something in the background, something you use every daybut for most developers, it's not a topic with much sex appeal.

But in fact, there are plenty of reasons Java programmers should find I/O interesting. Java includes a particularly rich set of I/O classes in the core API, mostly in the java.io and java.nio packages. These packages support several different styles of I/O. One distinction is between byte-oriented I/O, which is handled by input and output streams, and character-I/O, which is handled by readers and writers. Another distinction is between the old-style stream-based I/O and the new-style channel- and buffer-based I/O. These all have their place and are appropriate for different needs and use cases. None of them should be ignored.

Java's I/O libraries are designed in an abstract way that enables you to read from external data sources and write to external targets, regardless of the kind of thing you're writing to or reading from. You use the same methods to read from a file that you do to read from the console or from a network connection. You use the same methods to write to a file that you do to write to a byte array or a serial port device.

Reading and writing without caring where your data is coming from or where it's going is a very powerful abstraction. Among other things, this enables you to define I/O streams that automatically compress, encrypt, and filter from one data format to another. Once you have these tools, programs can send encrypted data or write zip files with almost no knowledge of what they're doing. Cryptography or compression can be isolated in a few lines of code that say, "Oh yes, make this a compressed, encrypted output stream."

In this book, I'll take a thorough look at all parts of Java's I/O facilities. This includes all the different kinds of streams you can use and the channels and buffers that offer high-performance, high-throughput, nonblocking operations on servers. We're also going to investigate Java's support for Unicode. We'll look at Java's powerful facilities for formatting I/O. Finally, we'll look at the various APIs Java provides for low-level I/O through various devices including serial ports, parallel ports, USB, Bluetooth, and other hardware you'll find in devices that don't necessarily look like a traditional desktop computer or server.

I won't go so far as to say, "If you've always found I/O boring, this is the book for you!" I will say that if you do find I/O uninteresting, you probably don't know as much about it as you should. I/O is the means for communication between software and the outside world. Java provides a powerful and flexible set of tools for doing this crucial part of the job. Having said that, let's start with the basics.



作者: 222.67.6.*  2007-2-8 07:57   回復(fù)此發(fā)言  


13 回復(fù):java io

java io 簡介


stream代表的是任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源,或是任何有能力接收數(shù)據(jù)的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括兩種類型:
(1)字節(jié)流
 表示以字節(jié)為單位從stream中讀取或往stream中寫入信息,即io包中的inputstream類和outputstream類的派生類。通常用來讀取二進(jìn)制數(shù)據(jù),如圖象和聲音。

(2)字符流 

以Unicode字符為導(dǎo)向的stream,表示以Unicode字符為單位從stream中讀取或往stream中寫入信息。

區(qū)別:

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

但是,Read和Write并不是取代InputStream和 OutputStream,有時(shí),你還必須同時(shí)使用"基于byte的類"和"基于字符的類"。為此,它還提供了兩個(gè)"適配器(adapter)"類。 InputStreamReader負(fù)責(zé)將InputStream轉(zhuǎn)化成Reader,而OutputStreamWriter則將 OutputStream轉(zhuǎn)化成Writer。

一.流的層次結(jié)構(gòu) 

定義:

(1)java將讀取數(shù)據(jù)對象成為輸入流,能向其寫入的對象叫輸出流。結(jié)構(gòu)圖如下:輸入流:



輸出流



二.InputStream類 

 

inputstream類和outputstream類都為抽象類,不能創(chuàng)建對象,可以通過子類來實(shí)例化。

InputStream是輸入字節(jié)數(shù)據(jù)用的類,所以InputStream類提供了3種重載的read方法.Inputstream類中的常用方法:

(1)public abstract int read( ):讀取一個(gè)byte的數(shù)據(jù),返回值是高位補(bǔ)0的int類型值。 

 

(2)public int read(byte b[ ]):讀取b.length個(gè)字節(jié)的數(shù)據(jù)放到b數(shù)組中。返回值是讀取的字節(jié)數(shù)。該方法實(shí)際上是調(diào)用下一個(gè)方法實(shí)現(xiàn)的 

 (3)public int read(byte b[ ], int off, int len):從輸入流中最多讀取len個(gè)字節(jié)的數(shù)據(jù),存放到偏移量為off的b數(shù)組中。 
(4) public int available( ):返回輸入流中可以讀取的字節(jié)數(shù)。注意:若輸入阻塞,當(dāng)前線程將被掛起,如果InputStream對象調(diào)用這個(gè)方法的話,它只會(huì)返回0,這個(gè)方法必須由繼承InputStream類的子類對象調(diào)用才有用, 

 (5) public long skip(long n):忽略輸入流中的n個(gè)字節(jié),返回值是實(shí)際忽略的字節(jié)數(shù), 跳過一些字節(jié)來讀取 

 
(6) public int close( ) :我們在使用完后,必須對我們打開的流進(jìn)行關(guān)閉. 
三.OutputStream類 
OutputStream提供了3個(gè)write方法來做數(shù)據(jù)的輸出,這個(gè)是和InputStream是相對應(yīng)的。 

 1. public void write(byte b[ ]):將參數(shù)b中的字節(jié)寫到輸出流。 

 

2. public void write(byte b[ ], int off, int len) :將參數(shù)b的從偏移量off開始的len個(gè)字節(jié)寫到輸出流。 

3. public abstract void write(int b) :先將int轉(zhuǎn)換為byte類型,把低字節(jié)寫入到輸出流中。 

 4. public void flush( ) : 將數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)全部輸出,并清空緩沖區(qū)。 

 

5. public void close( ) : 關(guān)閉輸出流并釋放與流相關(guān)的系統(tǒng)資源。 

 注意: 

 

1. 上述各方法都有可能引起異常。 
2. InputStream和OutputStream都是抽象類,不能創(chuàng)建這種類型的對象。 
四.FileInputStream類 
FileInputStream類是InputStream類的子類,用來處理以文件作為數(shù)據(jù)輸入源的數(shù)據(jù)流。使用方法: 
方式1: 

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

 

 FileInputStream in=new FileInputStream(fin); 

 

方式2: 

 

 FileInputStream in=new 

 

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

 

方式3: 

 

構(gòu)造函數(shù)將 FileDescriptor()對象作為其參數(shù)。 

 

FileDescriptor() fd=new FileDescriptor(); 



作者: 222.67.6.*  2007-2-8 10:45   回復(fù)此發(fā)言  


14 回復(fù):java io


 

FileInputStream f2=new FileInputStream(fd); 

五.FileOutputStream類 

 

FileOutputStream類用來處理以文件作為數(shù)據(jù)輸出目的數(shù)據(jù)流;一個(gè)表示文件名的字符串,也可以是File或FileDescriptor對象。 

 

創(chuàng)建一個(gè)文件流對象有兩種方法: 

 

方式1: 

 

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

 

FileOutputStream out=new FileOutputStream (f); 

 

方式2: 

 

 FileOutputStream out=new 

 

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

 

方式3:構(gòu)造函數(shù)將 FileDescriptor()對象作為其參數(shù)。 

 

FileDescriptor() fd=new FileDescriptor(); 

 

FileOutputStream f2=new FileOutputStream(fd); 

 

方式4:構(gòu)造函數(shù)將文件名作為其第一參數(shù),將布爾值作為第二參數(shù)。 

 

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

 

注意: 

 

(1)文件中寫數(shù)據(jù)時(shí),若文件已經(jīng)存在,則覆蓋存在的文件;(2)的讀/寫操作結(jié)束時(shí),應(yīng)調(diào)用close方法關(guān)閉流。 

 

 

 

舉例:2-1 

 

六.File類 

 

File類與InputStream / OutputStream類同屬于一個(gè)包,它不允許訪問文件內(nèi)容。 

 

File類主要用于命名文件、查詢文件屬性和處理文件目錄。 

 

舉例:2-2 

 

七.從一個(gè)流構(gòu)造另一個(gè)流 

 

java的流類提供了結(jié)構(gòu)化方法,如,底層流和高層過濾流。 

 

而高層流不是從輸入設(shè)備讀取,而是從其他流讀取。同樣高層輸出流也不是寫入輸出設(shè)備,而是寫入其他流。 

 

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

 

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

7.1 FilterInputStream

FilterInputStream的種類 

 


 
 
類 

 


 
 功能 

 


 
 構(gòu)造函數(shù)的參數(shù) 

 


 
 
 
用法 

 


 
 
 
DataInputStream 

 


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

 


 
 InputStream 

 


 
 
 
包含了一整套讀取primitive數(shù)據(jù)的接口。 

 


 
 
 
BufferedInputStream 

 


 
 用這個(gè)類來解決"每次要用數(shù)據(jù)的時(shí)候都要進(jìn)行物理讀取"的問題。你的意思是"用緩沖區(qū)。" 

 


 
 InputStream,以及可選的緩沖區(qū)的容量 

 


 
 
 
它本身并不提供接口,只是提供一個(gè)緩沖區(qū)。需要連到一個(gè)"有接口的對象(interface object)"。 

 


 
 
 
LineNumberInputStream 

 


 
 跟蹤輸入流的行號(hào);有g(shù)etLineNumber( )和setLineNumber(int)方法 

 


 
 InputStream 

 


 
 
 
只是加一個(gè)行號(hào),所以還得連一個(gè)"有接口的對象"。 

 


 
 
 
PushbackInputStream 

 


 
 有一個(gè)"彈壓單字節(jié)"的緩沖區(qū)(has a one byte push-back buffer),這樣你就能把最后讀到的那個(gè)字節(jié)再壓回去了。 

 


 
 InputStream 

 


 
 
 
主要用于編譯器的掃描程序??赡苁菫橹С諮ava的編譯器而設(shè)計(jì)的。用的機(jī)會(huì)不多。 



作者: 222.67.6.*  2007-2-8 10:45   回復(fù)此發(fā)言  


15 回復(fù):java io


 


 
 
 


 

 

 

FilterOutputStream的種類 

 


 
 
類 

 


 
 功能 

 


 
 構(gòu)造函數(shù)的參數(shù) 

 


 
 
 
用法 

 


 
 
 
DataOutputStream 

 


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

 


 
 OutputStream 

 


 
 
 
包括寫入primitive數(shù)據(jù)的全套接口。 

 


 
 
 
PrintStream 

 


 
 負(fù)責(zé)生成帶格式的輸出(formatted output)。DataOutputStrem負(fù)責(zé)數(shù)據(jù)的存儲(chǔ),而PrintStream負(fù)責(zé)數(shù)據(jù)的顯示。 

 


 
 一個(gè)OutputStream以及一個(gè)可選的boolean值。這個(gè)boolean值表示,要不要清空換行符后面的緩沖區(qū)。 

 


 
 
 
應(yīng)該是OutputStream對象的最終包覆層。用的機(jī)會(huì)很多。 

 


 
 
 
BufferedOutputStream 

 


 
 用 這個(gè)類解決"每次往流里寫數(shù)據(jù),都要進(jìn)行物理操作"的問題。也就是說"用緩沖區(qū)"。用flush( )清空緩沖區(qū)。 

 


 
 OutputStream, 以及一個(gè)可選的緩沖區(qū)大小 

 


 
 
 
本身并不提供接口,只是加了一個(gè)緩沖區(qū)。需要鏈接一個(gè)有接口的對象。 

 


 
 
 


 

 

 

 

DataInputStream類對象可以讀取各種類型的數(shù)據(jù)。 

 

DataOutputStream類對象可以寫各種類型的數(shù)據(jù); 

 

創(chuàng)建這兩類對象時(shí),必須使新建立的對象指向構(gòu)造函數(shù)中的參數(shù)對象。例如: 

 

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

 

DataInputStream din=new DataInputStream(in); 

 

7.2BufferInputStream和bufferOutputStream 

 

允許程序在不降低系統(tǒng)性能的情況下一次一個(gè)字節(jié)的從流中讀取數(shù)據(jù)。 

 

BufferInputstream定義了兩種構(gòu)造函數(shù) 

 

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

 

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

 

 第二個(gè)參數(shù)表示指定緩沖器的大小。 

 

同樣BufferOutputStream也有兩種構(gòu)造函數(shù)。一次一個(gè)字節(jié)的向流中寫數(shù)據(jù)。 

 

 

 

7.3printstream

用于寫入文本或基本類型 

 

兩種構(gòu)造函數(shù)方法: 

 

PrintStream ps=new PrintStream(out); 

 

PrintStream ps=new PrintStream(out, autoflush) 

 

第二個(gè)參數(shù)為布爾值,控制每次輸出換行符時(shí)java是否刷新輸出流。 

 

 

 

 

 

 

 

八.字符流的讀取和寫入 

 

java.io.Reader 和 java.io.InputStream 組成了 Java 輸入類。Reader 用于讀入16位字符,也就是 Unicode 編碼的字符;而 InputStream 用于讀入 ASCII 字符和二進(jìn)制數(shù)據(jù)。
Reader的體系結(jié)構(gòu)



(1) FileReader 

 

 FileReader主要用來讀取字符文件,使用缺省的字符編碼,有三種構(gòu)造函數(shù): 

 

 --將文件名作為字符串 

 

 FileReader f=new FileReader(“c:/temp.txt”); 

 

--構(gòu)造函數(shù)將File對象作為其參數(shù)。 

 

 File f=new file(“c:/temp.txt”); 

 

FileReader f1=new FileReader(f); 

 

--構(gòu)造函數(shù)將FileDescriptor對象作為參數(shù) 

 

FileDescriptor() fd=new FileDescriptor() 

 

FileReader f2=new FileReader(fd); 

 

(2) charArrayReader 

 

 將字符數(shù)組作為輸入流,構(gòu)造函數(shù)為: 

 

public CharArrayReader(char[] ch); 

 

(3) StringReader 

 

 讀取字符串,構(gòu)造函數(shù)如下: 

 

public StringReader(String s); 

 

(4) InputStreamReader 

 

從輸入流讀取字節(jié),在將它們轉(zhuǎn)換成字符。 

 

 Public inputstreamReader(inputstream is); 



作者: 222.67.6.*  2007-2-8 10:45   回復(fù)此發(fā)言  


16 回復(fù):java io


 

(5) FilterReader 

 

允許過濾字符流 

 

protected filterReader(Reader r); 

 

(6) BufferReader 

 

 接受Reader對象作為參數(shù),并對其添加字符緩沖器,使用readline()方法可以讀取一行。 

 

Public BufferReader(Reader r); 

 

 

 

Writer類體系結(jié)構(gòu)



(1) FileWrite 

 

 將字符類型數(shù)據(jù)寫入文件,使用缺省字符編碼和緩沖器大小。 

 

Public FileWrite(file f); 

 

(2)chararrayWrite() 

 

 將字符緩沖器用作輸出。 

 

 Public CharArrayWrite(); 

 

(3) PrintWrite 

 

 生成格式化輸出 

 

public PrintWriter(outputstream os); 

 

(4) filterWriter 

 

 用于寫入過濾字符流 

 

protected FilterWriter(Writer w);  

FilterOutputStream的種類  

  
 
類 

 


 
 功能 

 


 
 構(gòu)造函數(shù)的參數(shù) 

 


 
 
 
用法 

 


 
 
 
DataOutputStream 

 


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

 


 
 OutputStream 

 


 
 
 
包括寫入primitive數(shù)據(jù)的全套接口。 

 


 
 
 
PrintStream 

 


 
 負(fù)責(zé)生成帶格式的輸出(formatted output)。DataOutputStrem負(fù)責(zé)數(shù)據(jù)的存儲(chǔ),而PrintStream負(fù)責(zé)數(shù)據(jù)的顯示。 

 


 
 一個(gè)OutputStream以及一個(gè)可選的boolean值。這個(gè)boolean值表示,要不要清空換行符后面的緩沖區(qū)。 

 


 
 
 
應(yīng)該是OutputStream對象的最終包覆層。用的機(jī)會(huì)很多。 

 


 
 
 
BufferedOutputStream 

 


 
 用 這個(gè)類解決"每次往流里寫數(shù)據(jù),都要進(jìn)行物理操作"的問題。也就是說"用緩沖區(qū)"。用flush( )清空緩沖區(qū)。 

 


 
 OutputStream, 以及一個(gè)可選的緩沖區(qū)大小 

 


 
 
 
本身并不提供接口,只是加了一個(gè)緩沖區(qū)。需要鏈接一個(gè)有接口的對象。 

 


 
 
 


 

 

 

 

DataInputStream類對象可以讀取各種類型的數(shù)據(jù)。 

 

DataOutputStream類對象可以寫各種類型的數(shù)據(jù); 

 

創(chuàng)建這兩類對象時(shí),必須使新建立的對象指向構(gòu)造函數(shù)中的參數(shù)對象。例如: 

 

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

 

DataInputStream din=new DataInputStream(in); 

 

7.2BufferInputStream和bufferOutputStream 

 

允許程序在不降低系統(tǒng)性能的情況下一次一個(gè)字節(jié)的從流中讀取數(shù)據(jù)。 

 

BufferInputstream定義了兩種構(gòu)造函數(shù) 

 

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

 

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

 

 第二個(gè)參數(shù)表示指定緩沖器的大小。 

 

同樣BufferOutputStream也有兩種構(gòu)造函數(shù)。一次一個(gè)字節(jié)的向流中寫數(shù)據(jù)。 

 

 

 

7.3printstream

用于寫入文本或基本類型 

 

兩種構(gòu)造函數(shù)方法: 

 

PrintStream ps=new PrintStream(out); 

 

PrintStream ps=new PrintStream(out, autoflush) 

 

第二個(gè)參數(shù)為布爾值,控制每次輸出換行符時(shí)java是否刷新輸出流。 

 

 

 

 

 

 

 

八.字符流的讀取和寫入 

 

java.io.Reader 和 java.io.InputStream 組成了 Java 輸入類。Reader 用于讀入16位字符,也就是 Unicode 編碼的字符;而 InputStream 用于讀入 ASCII 字符和二進(jìn)制數(shù)據(jù)。
Reader的體系結(jié)構(gòu)



(1) FileReader 

 

 FileReader主要用來讀取字符文件,使用缺省的字符編碼,有三種構(gòu)造函數(shù): 

 

 --將文件名作為字符串 

 

 FileReader f=new FileReader(“c:/temp.txt”); 

 

--構(gòu)造函數(shù)將File對象作為其參數(shù)。 

 

 File f=new file(“c:/temp.txt”); 

 

FileReader f1=new FileReader(f); 

 

--構(gòu)造函數(shù)將FileDescriptor對象作為參數(shù) 

 

FileDescriptor() fd=new FileDescriptor() 

 

FileReader f2=new FileReader(fd); 

 

(2) charArrayReader 

 

 將字符數(shù)組作為輸入流,構(gòu)造函數(shù)為: 

 

public CharArrayReader(char[] ch); 

 

(3) StringReader 

 

 讀取字符串,構(gòu)造函數(shù)如下: 

 

public StringReader(String s); 

 

(4) InputStreamReader 

 

從輸入流讀取字節(jié),在將它們轉(zhuǎn)換成字符。 

 

 Public inputstreamReader(inputstream is); 

 

(5) FilterReader 

 

允許過濾字符流 

 

protected filterReader(Reader r); 

 

(6) BufferReader 

 

 接受Reader對象作為參數(shù),并對其添加字符緩沖器,使用readline()方法可以讀取一行。 

 

Public BufferReader(Reader r); 

 

 

 

Writer類體系結(jié)構(gòu)



(1) FileWrite 

 

 將字符類型數(shù)據(jù)寫入文件,使用缺省字符編碼和緩沖器大小。 

 

Public FileWrite(file f); 

 

(2)chararrayWrite() 

 

 將字符緩沖器用作輸出。 

 

 Public CharArrayWrite(); 

 

(3) PrintWrite 

 

 生成格式化輸出 

 

public PrintWriter(outputstream os); 

 

(4) filterWriter 

 

 用于寫入過濾字符流 

 

protected FilterWriter(Writer w);




作者: 222.67.6.*  2007-2-8 10:45   回復(fù)此發(fā)言  


17 java io simple code

13-1

import java.io.*;
class FileCopy {
 public static void main(String[] args) throw Exception {
 File InputStream input = new FileInputStream("java13.txt");
 //輸入當(dāng)前目錄下的java13.txt文件

 FileOutputStream output = new File OutputStream("java.bak");
 //輸出到當(dāng)前目錄下的java13.bak文件
 int size = input.available(); //檢查輸入字節(jié)數(shù)
 System.out.println("可輸入字節(jié)數(shù)為:" + size);
 for(int i = 0; i < size; i++) {
 output.write(input.read()); //拷貝到另一個(gè)文件
 }
 input.close();
 output.close();
 }
}


13-2

import java.io.*;
class CopyFile {
 public static void main(String[] args) throw Exception {
 FileReader fr = new FileReader("java13.txt");
 //輸入當(dāng)前目錄下的java13.txt文件

 FileWriter fw = new File FileWriter("java.bak");
 //輸出到當(dāng)前目錄下的java13.bak文件
 int ch;
 while((ch = fr.read())! = -1) {
 fw.write(ch); //拷貝
 }
 fr.close();
 fw.close();
 }
}

13-3

import java.io.*;
import java.util.*;

class ByteArrayOutputStreamTest {
 public static void main(String[] args) throw Exception { 
 ByteArrayOutputStream b = new ByteArrayOutputStream();
 System.out.println("請輸入七個(gè)字符,然后按回車");
 
 While(b.size() != 7) {
 b.write(System.in.read()); //b.size()返回b里的存有的字節(jié)數(shù)
 }
 System.out.println(b.toString()); //把b變成字符串輸出
 byte arr[] = b.toByteArray(); //把b存入字節(jié)數(shù)組arr[]
 for(int i = 0; i < arr.length; i++)
 System.out.print((char)arr[i]);
 
 System.out.println();
 OutputStream f = new FileOutputStream("test.doc");
 b.writeTo(f); //把b的內(nèi)容拷貝到f里去
 b.reset(); //reset()之后,再來輸入就從b的開始寫入
 }
}


13-4

import java.io.*;
public class ReaderWriter {
 public static void main(String[] args) throw IOException {
 echo(new InputStreamReader(System.in),
 new OutputStreamWriter(System.out));
 }

public static void echo(InputStreamReader is, OutputStreamWriter os) 

throws IOException {
 try {
 while(true) {
 //在MS-DOS窗口中運(yùn)行一個(gè)中文平臺(tái),輸入中文
 //CTRL-Z結(jié)束中文輸入
 int i = is.read(); //輸入流結(jié)束,返回-1
 if (i == -1) break;
 char c = (char) i;
 os.write©;
 }
 } catch(IOException e) {
 System.err.println(e);
 }
 os.flush();
 System.out.println("結(jié)束!");
 }
}

13-5

import java.io.*;
class FileTesting {
 public static void main(String args[]) {
 File f = new File("/temp/java12.txt");
 if (f.exists() == true) {
 System.out.println("這個(gè)文件存在。");
 System.out.println("文件名是:" + f.getName());
 System.out.println("文件路徑是:" + f.getPath());
 System.out.println("最后的修改日期是:" + f.lastModified());
 System.out.println("文件長度是:" + f.length());
 }
 }
}