IO流
用來處理設備之間的數據傳輸,java對數據的操作是通過流的方式,java用於操作流的對象都在IO包中
按操作數據分為:字節流和字符流;按流向分為:輸入流和輸出流。
程序從輸入流中讀取數據,向輸出流中寫入數據。
字節流的抽象基類:Inputstream 和 OutputStream;字符流的抽象基類:Reader 和 Writer
其他流均是繼承這4個抽象類而來的。轉換流
轉換流也是一種包裝流,其中OutputStreamWriter是Writer的子類,可以將一個字節流輸出流包裝成字符輸出流,方便直接寫入字符,而InputStreamReader是Reader的子類,它可以將一個字節輸入流包裝成字符輸入流,方便直接讀取字符。InputStreamReader讀取轉換流--------字節流通向字符流的橋梁
步驟 :
1.獲取鍵盤錄入對象
Inputstream in=System.in
2.將字節流對象轉換成字符流對象,使用轉換流InputStreamReader
InputStreamReader isr=new InputStreamReader(in);
3.提高效率使用字符流緩沖區 BufferedReader進行讀取
BufferedReader bf=new BufferedReader(isr);
String line=null;while((line=bf.readLine())!=null) {
if("over".equals(line))
break;
sop(line);
}
bufr.close;
OutputStreamReader寫入轉換流----------字符流通向字節流的橋梁
步驟 :
1.獲取輸出對象
Outputstream out=System.out
2.將字符流對象轉換成字節流對象,使用轉換流OutputstreamWriter
OutputstreamWriter osw=new OutputstreamWriter(out);
3.提高效率使用字符流緩沖區 BufferedWriter進行寫入
BufferedWriter bw=new BufferedWriter(osw);
String line=null;while((line=bf.readLine())!=null) {
if("over".equals(line))
break;
bw.write(line);
bufw.newLine();
}
bufr.close;
常用流
字節流InputStream
int read()
int read(byte[])
int read(byte[], int, int)
FileInputStream
AudioInputStream
ByteArrayInputStream
ObjectInputStream
PipedInputStream
int available()
void close()
OutputStream
write(int)
write(byte[])
write(byte[], int, int)
FileOutputStream
ByteArrayOutputStream
ObjectOutputStream
PipedOutputStream
flush()
close()
字符流
Reader
FileReader節點流
BufferedReader過濾流(處理流)
InputStreamReader轉換流
Writer
FileWriter節點流
BufferedWriter過濾流(處理流)
OutputStreamWriter轉換流
讀取鍵盤錄入
System.out:對應的是標准輸出設備,控制台
System.in:對應的標准輸入設備,鍵盤
InputStream in=System.in;
int by=in.read();
sop(by);
in.close(); //結束錄入
流操作規律
基本規律
1.明確源和目的
源:輸入流。InputStream字節流 Reader 字符流
目的:輸出流 OutPutStream 字節流 Writer 字符流
2.操作的數據是否是純文本
是就是字符流,如果設備是鍵盤 就將字節流轉換為字符流不是就是字節流
3.當體系明確后,在明確要是用那個具體的對象
通過設備來區分:
源設備 內存 硬盤 鍵盤
目的設備 內存 硬盤 控制台
4.是否需要提高效率
是 BufferedReader BufferedInputStream否 BuffreredWriter BufferedOutputStream
案例分析
1.將一個文本文件中的數據存儲到另一個文件中,復制文件
源:InputStream字節流 Reader 字符流是否是純文本 是 Reader
設備: 文件 操作文件的對象 就是FileReader
是否需要高效
是 BufferedReader
FileReader fr=new FileReader("a.txt");
BufferedReader bufr=new BufferedReader(fr);
目的:OutPutStream 字節流 Writer 字符流
是否是純文本 :是 Writer
設備: 文件 寫入文件的對象 就是 FileWriter
是否需要高效 是 BufferedWriter
FileWriter fw=new FileWriter("b.txt");
BufferedWriter bufw=new BufferedWriter(fw);
2.將一個圖片文件數據存儲到另一個文件中,復制文件。
源:是否是純文本 : 不是 InputStream
設備 文件 就是 FileInputStream
是否高效 是
BufferedInputStream
FileInputStream isr=new FileInputStream("a.jpg");
BufferedInputStream bufis=new BufferedInputStream(isr);
目的:是否純文本 :不是 OutPutStream
設備:文件 FileOutPutStream
是否高效 是
BufferedOutputStream
FileOutPutStream osw=new FileOutPutStream("b.jpg");
BufferedOutputStream bufos=new BufferedOutputStream(osw);
3.需求將鍵盤錄入的數據保存到一個文件中 。
源:鍵盤 字節流是否純文本 Reader
設備 :鍵盤 ,對應的對象時 System.in 對應的是字節流 ,為了操作方便 轉成字符流既然明確了Reader 就將System.in 轉換成字符流 InputStreamReader
InputStreamReader isr=new InputStreamReader(System.in);需要高效嗎 ?
BufferedReader bufr=new BufferedReader(isr);目的: 文件
是否純文本 是 Writer設備:文件 FileWriter
需要高效嗎?
是 BufferedWriter4.擴展 :想要把錄入的數據按照指定的編碼表(utf-8)將數據存到文件中
目的:OutPutStream 字節流 Writer 字符流
是否是存文本:是 Writer
設備 :文件 fileWriter默認編碼表是 gbk
編碼標只有轉換流可以指定。所以要使用的對象是寫入轉換流 OutputStreamWriter
轉換流需要接受一個自己輸出流,操作字節輸出流的是FileOutputStream
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8");BufferedWriter bufw=new BufferedWriter (osw);
通常涉及到字符編碼轉換的時候,就需要用到轉換流。
字符編碼
字符碼表
字符碼表是一種可以方便計算機識別的特定字符集,它是將每一個字符和一個唯一的數字對應而形成的一張表。ASCII、ISO8859-1、GB2312、GBK、Unicode、UTF-8
字符編碼和解碼把字符串轉換成計算機識別的字節序列稱為編碼
把字節序列轉換為普通人能看懂的明文字符串稱為解碼字符傳輸
通過構造方法InputStreamReader(InputStream in,String charsetName)和OutputStreamReader(OutputStream in,String charsetName)創建流對象時,可以對需要讀寫的數據指定編碼格式
兩種設計模式
適配器模式
將字節流適配成可以用字符的方式操作的字符流
適配:把不兼容的(接口)變成兼容的(接口)
InputStreamReaderOutuptStreamWriter
裝潢模式
處理流(過濾流)基本上都是用了裝潢模式
BufferedReader / BufferedWriterPrintStream / PrintWriter
DataInputStream / DataOutputStream