Ⅰ 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。
7.1 FilterInputStream
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 字元和二進制數據。
Reader的體系結構
(1) FileReader
FileReader主要用來讀取字元文件,使用預設的字元編碼,有三種構造函數:
--將文件名作為字元串
FileReader f=new FileReader(「c:/temp.txt」);
--構造函數將File對象作為其參數。
File f=new file(「c:/temp.txt」);
FileReader f1=new FileReader(f);
--構造函數將FileDescriptor對象作為參數
FileDescriptor() fd=new FileDescriptor()
FileReader f2=new FileReader(fd);
(2) charArrayReader
將字元數組作為輸入流,構造函數為:
public CharArrayReader(char[] ch);
(3) StringReader
讀取字元串,構造函數如下:
public StringReader(String s);
(4) InputStreamReader
從輸入流讀取位元組,在將它們轉換成字元。
Public inputstreamReader(inputstream is);
(5) FilterReader
允許過濾字元流
protected filterReader(Reader r);
(6) BufferReader
接受Reader對象作為參數,並對其添加字元緩沖器,使用readline()方法可以讀取一行。
Public BufferReader(Reader r);
Writer類體系結構
(1) FileWrite
將字元類型數據寫入文件,使用預設字元編碼和緩沖器大小。
Public FileWrite(file f);
(2)chararrayWrite()
將字元緩沖器用作輸出。
Public CharArrayWrite();
(3) PrintWrite
生成格式化輸出
public PrintWriter(outputstream os);
(4) filterWriter
用於寫入過濾字元流
protected FilterWriter(Writer w);
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怎麼輸出
java控制台輸出由print( ) 和 println( )來完成最為簡單。這兩種方法由rintStream(System.out引用的對象類型)定義。盡管System.out是一個位元組流,用它作為簡單程序的輸出是可行的。因為PrintStream是從OutputStream派生的輸出流,它同樣實現低級方法write(),write()可用來向控制台寫數據。PrintStream 定義的write( )的最簡單的形式如下:
void write(int byteval)
該方法按照byteval指定的數目向文件寫位元組。盡管byteval 定義成整數,但只有低位的8個位元組被寫入。下面的短例用 write()向屏幕輸出字元「A」,然後是新的行。
// Demonstrate System.out.write().
class WriteDemo {
public static void main(String args[]) {
int b;
b = 'A';
System.out.write(b);
System.out.write(' ');
}
}
一般不常用write()來完成向控制台的輸出(盡管這樣做在某些場合非常有用),因為print()和println() 更容易用。
四、PrintWriter類
盡管Java允許用System.out向控制台寫數據,但建議僅用在調試程序時或在常式中。對於實際的程序,Java推薦的向控制台寫數據的方法是用PrintWriter流。PrintWriter是基於字元的類。用基於字元類向控制台寫數據使程序更為國際化。PrintWriter定義了多個構造函數,這里所用到的一個如下:
PrintWriter(OutputStream outputStream, boolean flushOnNewline)
outputStream是OutputStream類的對象,flushOnNewline控制Java是否在println()方法被調用時刷新輸出流。如果flushOnNewline為true,刷新自動發生,若為false,則不發生。
PrintWriter支持所有類型(包括Object)的print( )和println( )方法,這樣,就可以像用ystem.out那樣用這些方法。如果遇到不同類型的情況,PrintWriter方法調用對象的toString()方法並列印結果。用PrintWriter向外設寫數據,指定輸出流為System.out並在每一新行後刷新流。例如這行代碼創建了與控制台輸出相連的PrintWriter類。
PrintWriter pw = new PrintWriter(System.out, true);
下面的應用程序說明了用PrintWriter處理控制台輸出的方法:
// Demonstrate PrintWriter
import java.io.*;
public class PrintWriterDemo {
public static void main(String args[]) {
PrintWriter pw = new PrintWriter(System.out, true);
pw.println("This is a string");
int i = -7;
pw.println(i);
double d = 4.5e-7;
pw.println(d);
}
}
該程序的輸出如下:
This is a string
-7
4.5E-7
Ⅲ java如何使用文件位元組輸出流類:FileOutputStream
文件位元組輸出流關聯指定文件路徑的文件,數據通過文件位元組輸出流以位元組為單位輸出並保存到文件中。文件位元組輸出流繼承自OutputStream類,並實現OutputStream類的各種方法。
文件位元組輸出流的構造方法語法如下:
語法1:以File對象為參數創建FileOutputStream實例
語法2:以文件對象的絕對路徑為參數創建FIleOutputStream實例
Ⅳ java如何使用位元組輸出流抽象類OutputStream類
OutputStream定義了輸出流的各種方法,如下表:
返回
方法
說明
void write(byte[ ] b) 將byte[ ] 數組中的數據寫入當前輸出流
void write(byte[] b ,int off, int len) 將byte[ ]數組下標off開始的len長度的數據寫入當前輸出流
Abstract void write(int b) 寫入一個byte數據到當前輸出流
void flush() 刷新當前輸出流,並強制寫入所有緩沖的位元組數據
void close() 關閉當前輸出流
Ⅳ 6 請簡述java io中stream流和read流的區別,並分別列舉2個常用的stream流和read流
Java 流在處理上分為字元流和位元組流。字元流處理的單元為 2 個位元組的 Unicode 字元,分別操作字元、字元數組或字元串,而位元組流處理單元為 1 個位元組,操作位元組和位元組數組。
Java 內用 Unicode 編碼存儲字元,字元流處理類負責將外部的其他編碼的字元流和 java 內 Unicode 字元流之間的轉換。而類 InputStreamReader 和 OutputStreamWriter 處理字元流和位元組流的轉換。字元流(一次可以處理一個緩沖區)一次操作比位元組流(一次一個位元組)效率高。
( 一 )以位元組為導向的 stream------InputStream/OutputStream
InputStream 和 OutputStream 是兩個 abstact 類,對於位元組為導向的 stream 都擴展這兩個雞肋(基類 ^_^ ) ;
1、 InputStream
1.1
ByteArrayInputStream -- 把內存中的一個緩沖區作為 InputStream 使用 .
construct---
(A)ByteArrayInputStream(byte[]) 創建一個新位元組數組輸入流( ByteArrayInputStream ),它從指定位元組數組中讀取數據( 使用 byte 作為其緩沖區數組)
(B)---ByteArrayInputStream(byte[], int, int) 創建一個新位元組數組輸入流,它從指定位元組數組中讀取數據。
---mark:: 該位元組數組未被復制。
1.2
StringBufferInputStream -- 把一個 String 對象作為 InputStream .
construct---
StringBufferInputStream(String) 據指定串創建一個讀取數據的輸入流串。
注釋:不使用 StringBufferInputStream 方法。此類不能將字元正確的轉換為位元組。
同 JDK 1.1 版中的類似,從一個串創建一個流的最佳方法是採用 StringReader 類。
1.3
FileInputStream -- 把一個文件作為 InputStream ,實現對文件的讀取操作
construct---
(A)FileInputStream(File name) 創建一個輸入文件流,從指定的 File 對象讀取數據。
(B)FileInputStream(FileDescriptor) 創建一個輸入文件流,從指定的文件描述器讀取數據。
(C)-FileInputStream(String name) 創建一個輸入文件流,從指定名稱的文件讀取數據。
method ---- read() 從當前輸入流中讀取一位元組數據。
read(byte[]) 將當前輸入流中 b.length 個位元組數據讀到一個位元組數組中。
read(byte[], int, int) 將輸入流中 len 個位元組數據讀入一個位元組數組中。
1.4
PipedInputStream :實現了 pipe 的概念,主要在線程中使用 . 管道輸入流是指一個通訊管道的接收端。
一個線程通過管道輸出流發送數據,而另一個線程通過管道輸入流讀取數據,這樣可實現兩個線程間的通訊。
construct---
PipedInputStream() 創建一個管道輸入流,它還未與一個管道輸出流連接。
PipedInputStream(PipedOutputStream) 創建一個管道輸入流 , 它已連接到一個管道輸出流。
1.5
SequenceInputStream :把多個 InputStream 合並為一個 InputStream . 「序列輸入流」類允許應用程序把幾個輸入流連續地合並起來,
並且使它們像單個輸入流一樣出現。每個輸入流依次被讀取,直到到達該流的末尾。
然後「序列輸入流」類關閉這個流並自動地切換到下一個輸入流。
construct---
SequenceInputStream(Enumeration) 創建一個新的序列輸入流,並用指定的輸入流的枚舉值初始化它。
SequenceInputStream(InputStream, InputStream) 創建一個新的序列輸入流,初始化為首先 讀輸入流 s1, 然後讀輸入流 s2 。
2、 OutputSteam
2.1
ByteArrayOutputStream : 把信息存入內存中的一個緩沖區中 . 該類實現一個以位元組數組形式寫入數據的輸出流。
當數據寫入緩沖區時,它自動擴大。用 toByteArray() 和 toString() 能檢索數據。
constructor
(A)--- ByteArrayOutputStream() 創建一個新的位元組數組輸出流。
(B)--- ByteArrayOutputStream() 創建一個新的位元組數組輸出流。
(C)--- ByteArrayOutputStream(int) 創建一個新的位元組數組輸出流,並帶有指定大小位元組的緩沖區容量。
toString(String) 根據指定字元編碼將緩沖區內容轉換為字元串,並將位元組轉換為字元。
write(byte[], int, int) 將指定位元組數組中從偏移量 off 開始的 len 個位元組寫入該位元組數組輸出流。
write(int) 將指定位元組寫入該位元組數組輸出流。
writeTo(OutputStream) 用 out.write(buf, 0, count) 調用輸出流的寫方法將該位元組數組輸出流的全部內容寫入指定的輸出流參數。
2.2
FileOutputStream: 文件輸出流是向 File 或 FileDescriptor 輸出數據的一個輸出流。
constructor
(A)FileOutputStream(File name) 創建一個文件輸出流,向指定的 File 對象輸出數據。
(B)FileOutputStream(FileDescriptor) 創建一個文件輸出流,向指定的文件描述器輸出數據。
(C)FileOutputStream(String name) 創建一個文件輸出流,向指定名稱的文件輸出數據。
(D)FileOutputStream(String, boolean) 用指定系統的文件名,創建一個輸出文件。
2.3
PipedOutputStream: 管道輸出流是指一個通訊管道的發送端。一個線程通過管道輸出流發送數據,
而另一個線程通過管道輸入流讀取數據,這樣可實現兩個線程間的通訊。
constructor
(A)PipedOutputStream() 創建一個管道輸出流,它還未與一個管道輸入流連接。
(B)PipedOutputStream(PipedInputStream) 創建一個管道輸出流,它已連接到一個管道輸入流。
( 二 )以字元為導向的 stream Reader/Writer
以 Unicode 字元為導向的 stream ,表示以 Unicode 字元為單位從 stream 中讀取或往 stream 中寫入信息。
Reader/Writer 為 abstact 類
以 Unicode 字元為導向的 stream 包括下面幾種類型:
Reader
1.1
CharArrayReader :與 ByteArrayInputStream 對應此類實現一個可用作字元輸入流的字元緩沖區
constructor
CharArrayReader(char[]) 用指定字元數組創建一個 CharArrayReader 。
CharArrayReader(char[], int, int) 用指定字元數組創建一個 CharArrayReader
1.2
StringReader : 與 StringBufferInputStream 對應其源為一個字元串的字元流。
StringReader(String) 創建一新的串讀取者。
1.3
FileReader : 與 FileInputStream 對應
1.4
PipedReader :與 PipedInputStream 對應
2. Writer
2.1 CharArrayWrite : 與 ByteArrayOutputStream 對應
2.2 StringWrite :無與之對應的以位元組為導向的 stream
2.3 FileWrite : 與 FileOutputStream 對應
2.4 PipedWrite :與 PipedOutputStream 對應
3、兩種不同導向的 stream 之間的轉換
3.1
InputStreamReader 和 OutputStreamReader :
把一個以位元組為導向的 stream 轉換成一個以字元為導向的 stream 。
InputStreamReader 類是從位元組流到字元流的橋梁:它讀入位元組,並根據指定的編碼方式,將之轉換為字元流。
使用的編碼方式可能由名稱指定,或可接受的預設編碼方式。
InputStreamReader 的 read() 方法之一的每次調用,可能促使從基本位元組輸入流中讀取一個或多個位元組。
為了達到更高效率,考慮用 BufferedReader 封裝 InputStreamReader ,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
例如: // 實現從鍵盤輸入一個整數
view plain to clipboardprint?
String s = null;
InputStreamReader re = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(re);
try {
s = br.readLine();
System.out.println("s= " + Integer.parseInt(s));
br.close();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (NumberFormatException e)// 當應用程序試圖將字元串轉換成一種數值類型,但該字元串不能轉換為適當格式時,拋出該異常。
{
System.out.println(" 輸入的不是數字 ");
}
String s = null; InputStreamReader re = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(re); try { s = br.readLine(); System.out.println("s= " + Integer.parseInt(s)); br.close(); } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e)// 當應用程序試圖將字元串轉換成一種數值類型,但該字元串不能轉換為適當格式時,拋出該異常。 { System.out.println(" 輸入的不是數字 "); }
InputStreamReader(InputStream) 用預設的字元編碼方式,創建一個 InputStreamReader 。
InputStreamReader(InputStream, String) 用已命名的字元編碼方式,創建一個 InputStreamReader 。
OutputStreamWriter 將多個字元寫入到一個輸出流,根據指定的字元編碼將多個字元轉換為位元組。
每個 OutputStreamWriter 合並它自己的 CharToByteConverter, 因而是從字元流到位元組流的橋梁。
(三)Java IO 的一般使用原則:
一、按數據來源(去向)分類:
1 、是文件: FileInputStream, FileOutputStream, ( 位元組流 )FileReader, FileWriter( 字元 )
2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 位元組流 )
3 、是 Char[]: CharArrayReader, CharArrayWriter( 字元流 )
4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 位元組流 )StringReader, StringWriter( 字元流 )
5 、網路數據流: InputStream, OutputStream,( 位元組流 ) Reader, Writer( 字元流 )
二、按是否格式化輸出分:
1 、要格式化輸出: PrintStream, PrintWriter
三、按是否要緩沖分:
1 、要緩沖: BufferedInputStream, BufferedOutputStream,( 位元組流 ) BufferedReader, BufferedWriter( 字元流 )
四、按數據格式分:
1 、二進制格式(只要不能確定是純文本的) : InputStream, OutputStream 及其所有帶 Stream 結束的子類
2 、純文本格式(含純英文與漢字或其他編碼方式); Reader, Writer 及其所有帶 Reader, Writer 的子類
五、按輸入輸出分:
1 、輸入: Reader, InputStream 類型的子類
2 、輸出: Writer, OutputStream 類型的子類
六、特殊需要:
1 、從 Stream 到 Reader,Writer 的轉換類: InputStreamReader, OutputStreamWriter
2 、對象輸入輸出: ObjectInputStream, ObjectOutputStream
3 、進程間通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4 、合並輸入: SequenceInputStream
5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
決定使用哪個類以及它的構造進程的一般准則如下(不考慮特殊需要):
首先,考慮最原始的數據格式是什麼: 原則四
第二,是輸入還是輸出:原則五
第三,是否需要轉換流:原則六第 1 點
第四,數據來源(
Ⅵ java中有哪些常用的輸入/輸出流,它們的主要區別是什麼
以 Stream 結尾的都是位元組流,就是一個位元組一個位元組的讀取都有些什麼類 你去網路一下就知道了,很好找Input還是output 都是對於你自己的程序而言的 Input 就是輸入流,對於你的程序 是有東西 輸入進來了,也就是讀取別人的東西output 就是輸出流,對於你的程序 是把東西 輸出去了,就是 把東西 寫入到別人的文件里
BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter DataInputStream DataOutputStream FileInputStream FileOutputStream FileReader FileWriter FilterInputStream FilterOutputStream FilterReader FilterWriter InputStream InputStreamReader LineNumberInputStream LineNumberReader ObjectInputStream ObjectOutputStream OutputStream OutputStreamWriter PipedInputStream PipedOutputStream PipedReader PipedWriter PrintStream PrintWriter Reader StringBufferInputStream StringReader StringWriter WriterWriter和Reader為字元流 input和output為位元組流至於如何確定 看名字就知道了
Ⅶ java輸入輸出流哪種最常用
InputStream,OutputStream,FileInputStream,FileOutputStream,位元組流
Reader,Writer,FileReader,FileWriter,BufferedReader,字元流...
DataInputStream,DataOutputStream,數據流...
Ⅷ java 輸入輸出流 (被採納為答案者加100分)
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。
7.1 FilterInputStream
.......
具體去這里看看把,有很詳細的介紹。希望對你有幫助。
Ⅸ java web response 怎樣獲得輸出流
ServletResponse中定義了如下兩個方法
getOutputStream();
getWriter();
對應獲得位元組流和字元流
由於HttpServletResponse繼承自ServletResponse所以天生也具有以上兩個獲得輸出流的方法
Ⅹ java IO輸入輸出流中的各種位元組流,字元流類,我需要都記住嗎,還是只要記住幾個常用的呢
記住幾個常用的就行了, 一般也就是用幾個常用的。
位元組流
位元組流主要是操作byte類型數據,也byte數組為准,主要操作類就是
·位元組輸出流:OutputStream
·位元組輸入流:InputStream
字元流
在程序中一個字元等於2個位元組,那麼java提供了Reader、Writer兩個專門操作字元流的類。
·字元輸出流:Writer
·字元輸入流:Reader
位元組-字元轉換流
OutputStreamWriter和InputStreamReader
在整個IO包中,實際上就是位元組流和字元流,但是除了這兩個流之外,還存在一組位元組流-字元流的轉換類。
[java] view plainprint?
•OutputStreamWriter:是Writer的子類,將輸出的字元流轉換為位元組流。即:將一個位元組流的輸出對象變為位元組流的輸出對象
•InputStreamReader:是Reader的子類,將輸入的位元組流變為字元流,即:將一個位元組流的輸入對象變為字元流的輸入對象。