黑馬程式設計師——IO輸入與輸出(一)
--------------------- <a href="http://edu.csdn.net/heima" target="blank">android培訓</a>、<a href="http://edu.csdn.net/heima" target="blank">java培訓</a>、期待與您交流! ----------------------
IO流 :Input(輸入)Output(輸出)。簡稱輸入輸出流。IO流就是處理裝置之間的資料傳輸。java對資料的操作是通過資料流的方法來完成的。
流按流向分為:輸入流,輸出流。
流按位元組分為:
位元組流:
字元流:為了處理文字資料方便而出現的物件。其實這些物件內部使用的還是位元組流(因為文字最終頁是位元組資料)。只不過,通過位元組流讀取了相對應的位元組數,沒有對這些位元組直接操作。而是去查了指定的(本機預設的)編碼表。獲取到了對應的文字。簡單說:字元流就是:位元組流+編碼表。
IO流中的最基本的最長用的基類:IO流的四大體系
1、位元組流的抽象基類:InputStream 從外圍裝置到記憶體的流 OutputStream 從記憶體到外圍裝置的流
2、字元流的抽象基類:Reader 讀者(也是從外圍裝置到記憶體) Writer 作者(也是從記憶體到外圍裝置)
由這四個基本流派生出來的子類都有一個共同的特點:那就是子類的名稱都是以其父類名作為子類名的字尾。
*****************************************************************************************************************************************************************************************規律總結:
1.
源:鍵盤錄入。
目的:控制檯。
2.
需求:想把鍵盤錄入的資料儲存到一個檔案中。
源:鍵盤。
目的:檔案。
3.需求:想要將一個檔案的資料列印在控制檯上
源:檔案。
目的:控制檯。
流操作的基本規律:
最痛苦的就是流物件有很多,不知道該用那一個。
通過兩個明確來完成。
1.明確源和目的。
源:輸入流。 InputStream Reader
目的:輸出流。OutputStream Writer
2.操作的資料是否為純文字。
是,位元組流。
不是,位元組流。
3.當體系明確後,再明確要使用哪個具體的物件。
通過裝置來進行區分
源裝置:記憶體,硬碟,鍵盤。
目的裝置:記憶體,硬碟,控制檯。
*****************************************************************************************************************************************************************************************
例項:
1.將一個文字檔案中的資料儲存到另一個檔案中,複製檔案。
源:因為是源,所以使用讀取流。InputStream Reader
是不是操作文字檔案。
是!這時就可以選擇 Reader
這樣體系就明確了。
接下來明確要使用體系中的哪個物件。
明確裝置:硬碟上一個檔案。
Reader體系中可以操作檔案的物件是 FileReader
是否需要提高效率:是!加入Reader體系中緩衝區 BufferedReader
FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr);
目的:OutputStream Writer
是否是純文字。
是!Writer
裝置:硬碟,一個檔案。
writer體系中可以操作檔案的物件FileWriter。
是否需要提高效率:是!加入Reader體系中緩衝區 BufferedWriter
FileWriter fr = new FileWriter("b.txt");
BufferedWriter bufr = new BufferedWriter(fr);
需求:將一個圖片檔案中的資料儲存到另一個檔案中。
package cn.kang;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyPic {
/**
* @param args
* 拷貝一張圖片
*/
public static void main(String[] args) {
FileOutputStream fos = null;
FileInputStream fis = null;
try {
fos = new FileOutputStream("c1.jpg");
fis = new FileInputStream("1.jpg");
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
} catch (IOException e) {
throw new RuntimeException("複製圖片失敗!!!");
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
throw new RuntimeException("檔案關閉失敗!!");
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
throw new RuntimeException("檔案關閉失敗!!");
}
}
}
}
}
}
package cn.kang;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyMP3 {
/**
* @param args
* MP3的複製
* @throws IOException
*/
public static void main(String[] args) throws IOException {
copy_1();
}
//通過位元組流的huanc區完成複製
public static void copy_1() throws IOException{
BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("1.mp3"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("tmmdh.mp3"));
int by = 0;
while((by = bufis.read()) != -1){
bufos.write(by);
}
bufis.close();
bufos.close();
}
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.需求:將鍵盤錄入的資料儲存到一個檔案中。
這個要求中有源和目的都存在。
那麼分別分析
源: InputStream Reader
是不是純文字?不是!Reader
裝置:鍵盤。對應的物件是 System.in
不是選擇Reader嗎?System.in對應的不是位元組流嗎?
為了操作鍵盤的文字資料方便,轉成字元流按照字串操作是最方便的。
所以既然明確了Reader,那麼就將 System.in轉換成Reader
用了Reader體系中轉換流,InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需求提高效率嗎?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的: OutputStream Writer
是否是純文字?是!Writer
裝置:硬碟。一個檔案。使用 FileWriter
FileWriter fw = new FileWriter("c.txt");
需要提高效率嗎?需要。
BufferedWriter bufw = new BufferedWriter(fw);
擴充套件一下,想要把記錄的資料按照指定的編碼表(utf-8),將資料存到檔案中。
目的:OutputStream Writer
是否是純文字。是!Writer
裝置:硬碟,一個檔案。使用FileWriter
但是FileWriter是使用的預設編碼表。GBK
但是儲存時,需要加入指定編碼表,而指定編碼表只有轉換流可以指定。
所以要使用的物件是 OutputStreamWriter
而該轉換流物件要接收一個位元組輸出流。而且還可以操作的檔案的位元組輸出流。FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要提高效率嗎?需要。
BufferedWriter bufw = new BufferedWriter(sfw);
所以,記住,轉換流是字元和位元組之間的橋樑,通常,涉及到字元編碼轉換是,需要用到轉換流。
//練習:將一個文字資料列印在控制檯上//
package cn.kang;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TransStreamDemo {
/**
* @param args
* 鍵盤錄入
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("jplr.txt")));
String line = null;
while((line = bufr.readLine())!= null){
if("over".equalsIgnoreCase(line))
break;
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
}
}
--------------------- <a href="http://edu.csdn.net/heima" target="blank">android培訓</a>、<a href="http://edu.csdn.net/heima" target="blank">java培訓</a>、期待與您交流! ----------------------