對于java的IO流的理解很長時間來都是很亂,包括學習其他的語言對這一塊知識也都算是一個盲點.更多的時候一提到讀取保存數據就是使用數據庫。這一次學習了IO流,自己又解決了一個很大的盲點。
IO流為我們提供了這樣一種方案,就是把我們的數據保存到文件中,或者從文件中讀取我們的數據。IO流為我們提供了一條通道程序,可以使用這條通道把源中的字節序列送到目的地.源可以是文件、網絡、壓縮包或者其他數據源。
### IO流分類
1.按流的方向分為輸入流和輸出流
2.按流的數據單位分為字節流和字符流
3.按功能分為字節流和處理流
### 節點流
節點流可以從一特定的數據源讀寫數據.


### 處理流
處理流是”連接”在已存在的流(節點流或處理流)之上.為對數據的處理提供更強大的讀寫功能.


關于節點就和處理流.就好比給了我們一桶水,我們需要一條水管將水引出來,這條水管就是節點流.但是流出來的水我們一看是不太干凈,所以我們需要一個凈化器,這個凈化器就是處理流。
### IO流的四大抽象類
InputStream:繼承自InputStream的流都是用于向程序中輸入數據。且數據的單位為字節(8bit)
outputSteam:與inputStream相似,用來輸出數據。
Reader:繼承自Reader的流都是用于向程序中輸入數據,數據單位為字符(16 bit)
Write:與Reader相似,用于輸出數據.

### 緩沖流
上面的輸入輸出流一次只能讀取一個字節或者字符.如果我有1024個字節要讀取,那么我要進行1024次操作。可以想象如果文件十分龐大這樣的操作肯定會先很大的問題。基于這種問題,引出了緩沖流的概念。緩沖流就好比在水管后又加了一個水盆。
### 數據流
當我們需要讀取java的一些基本類型的時候,如果使用inputStream和OutputStream會不斷的進行轉換。比如我們讀取一個long類型的值(long類型占8個字節)時,讀取很多次。此時數據流就為我們提供了這樣一種操作。那就是直接讀取這數值。
### 對象流
對象流就是把一個Object直接轉換成字節流寫到硬盤上或者網絡上.這種操作叫做序列化.
### 幾個小例子
1.第一個例子,演示了FileInputStream和FileOutStream的使用,該例子實現的是將a.txt中的文本復制一份到b.txt中去。
read()方法一次只能讀取一個字節。使用當返回值為-1時表示已經讀到了文本的末尾。
使用輸入輸出流要注意異常的處理。此處處理了兩個異常
~~~
public static void main(String[] args) {
int b=0;
FileInputStream in=null;
FileOutputStream out=null;
try
{
in=new FileInputStream("G:/a.txt");
out =new FileOutputStream("G:/b.txt");
while((b=in.read())!=-1)
{
out.write(b);
}
in.close();
out.close();
}
catch(FileNotFoundException e2)
{
System.out.println("沒有發現文件");
System.exit(-1);
}
catch(IOException e1)
{
System.out.println("文件復制錯誤");
System.exit(-1);
}
System.out.println("文件以復制");
}
~~~
2.第二個例子展示了緩沖流的使用 使用緩沖流時readLine()方法一次可以讀取一行數據.
此處有個強制類型轉換.要注意,不然輸出的會是ASCII碼.
~~~
public static void main(String[] args) {
try
{
FileReader fis=new FileReader("G:/a.txt");
BufferedReader bis=new BufferedReader(fis);
int c=0;
System.out.println(bis.readLine());//讀取一行字符串
for(int i=1;i<=3&&(c=bis.read())!=-1;i++)
{
System.out.print((char)c+"");//強制類型轉換,不然輸出的是ASCII碼
}
System.out.println();
bis.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
~~~
### 總結
IO流的帶給了我另一種保存數據的方式,以前保存數據,就只會想到數據庫.而現在我們又多了一種新的方式.對于IO流重要的是要理解字節流和處理流這兩個概念.字節流負責把數據從數據源提取出來(或者將數據保存到文檔中),而處理流是要對數據進行處理,其中有緩沖流,數據流和對象流,針對不同的使用環境我們要甄別使用,處理流可以重疊使用.然后理解了四個抽象類以及他們的方法.掌握了這些對于IO流的理解就算是基本入門了。
? ? ??
?