1. 程式人生 > >黑馬程式設計師——IO輸入與輸出(一)

黑馬程式設計師——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>、期待與您交流! ----------------------