一、什麼是IO(Input/Output)
程式是運行在記憶體中的,IO就是JAVA程式它所啟動並執行記憶體之外的節點互相傳遞資料的一種類似於管道的概念。
二、流
1、概念:JAVA與其他節點間互換資料使用的通道,其實的話就相當於一個水管接在兩個節點之間進行資料的傳輸
2、分類:
1)、按照方向分:輸入資料流、輸出資料流
講到這個輸入和輸出可能有些人就犯迷糊了,究竟什麼情況下叫做輸入,什麼情況下又叫做輸出呢?那我就舉一個例子:JAVA會在我們的電腦記憶體中建立一塊記憶體(JAVA記憶體),而另外一個節點比如說是我們硬碟中的一個檔案(硬碟),當JAVA記憶體的資料輸入到硬碟的時那就叫做輸出,相反硬碟把資料讀到JAVA記憶體中就叫輸入。也就是說輸入和輸出是相對於JAVA記憶體在講的,凡是往JAVA記憶體中添加資料就是輸入(Input),反之就是輸出(Output)
2)、按照內容分:
位元組流:一個位元組一個位元組來傳輸 如果是要用來傳輸中文字元的話會把中文拆分成兩個位元組一個一個傳輸
字元流:一個字元一個字元傳輸(JAVA中一個字元是2個位元組)
知識擴充:JAVA的流都是從四個抽象類別中繼承的:InputStream/OutputStream(位元組流)Reader/Writer(字元流)並且InputStream和Reader,OutputStream和Writer的作用是相類似的
如比較詳細和形象的描繪出了他們之間的關係
3)、按功能上來分:
節點流:流的兩端直接接在節點上,功能負責兩個節點間傳輸資料
下面這個小程式實現了檔案之間的拷貝:
import java.io.*;
public class test{
public static void main(String[] args) throws Exception{
FileInputStream is = new FileInputStream("e:/123.txt");
FileOutputStream os = new FileOutputStream("e:/abc.txt");
int n = -1;
while((n = is.read()) != -1){
os.write((char)n);
}
is.close();
os.close();
}
}
注意:1、當JAVA往外面寫資料的時候,如果流關閉再向檔案寫資料就會發生覆蓋,如果關閉之前那麼就會追加
2、只要是JAVA和別的內容建立串連(IO、資料庫連接、socket串連)第一消耗時間,第二消耗資源,所以說用完務必關閉。
3、位元組流中使用的是ISO-8859-1的編碼;字元流使用的是unicode編碼(UTF-8)所以說如果傳輸的資料當中是字元的話必須使用字元流,如上程式,只要把FileInputStream is = new FileInputStream("e:/123.txt");和FileOutputStream os = new FileOutputStream("e:/abc.txt");修改成:FileReader is = new FileReader ("e:/123.txt");和FileWriter os = new FileWriter ("e:/abc.txt");即可
處理流:不能直接接在節點上,只能套在節點流上。作用給節點流增加額外的功能。處理流不能單獨使用(套在節點流的外面來增加功能)
緩衝流:給節點流增加緩衝區的功能
緩衝區:硬碟的損耗速度是跟硬碟的讀寫次數有關係的。在沒有使用緩衝區的時候,往硬碟中寫資料的時候是一個位元組一個位元組寫的,如果使用緩衝區, 大小預設為8MB的話,會把資料先放到緩衝區中,當緩衝區中滿後會自動寫到硬碟當中,起到了保護硬碟的作用。
Flush()的兩個作用:強制性的把緩衝區的資料寫出到檔案當中;重新整理清空緩衝區
轉換流:把位元組流轉換成字元流,所以只能套在位元組流(基本上沒有多大作用)
三、Date(資料流):
流裡面傳輸的只能是字元和位元組。不能傳輸JAVA的資料類型,但是資料流他就可以指定傳輸JAVA的資料類型,而且資料流他也是一個套在一個JAVA記憶體與硬碟之間的傳輸管道裡面的。它可以寫UTF或是Int類型的,並且這些都是屬於JAVA自己本身認識的,在哦我們看來就是一些編碼,但是對於JAVA來說它可以完全的認清楚他是什麼資料類型。這個資料流會經常使用在我們以後用到的程式當中。
四、Object流:
作用:JAVA5.0的新特性序列化,他的作用就是用來讀取對象的
序列化:把JAVA的對象寫出去。它跟持久化差不多
還原序列化:把讀進來的資料封裝成JAVA的對象
使用Object流來儲存對象的時候必須在被儲存對象的類中實現Serializable序列化介面。但是如果不想對對象中的某個屬性序列化就在前面加上 transient關鍵字
如下程式描述了Object流的使用方法:
1 import java.io.*; 2 3 public class test{ 4 5 public static void main(String[] args) throws Exception{ 6 7 //ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/abc.txt")); 8 9 //oos.writeObject(new Person("jack","23","boy","student"));10 11 //oos.close(); 12 13 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/abc.txt"));14 15 Person p = (Person)ois.readObject();16 17 System.out.println(p.name);18 19 System.out.println(p.age);20 21 System.out.println(p.sex);22 23 System.out.println(p.job);24 } 25 }26 27 class Person implements Serializable{28 29 String name;30 31 String age;32 33 transient String sex;34 35 String job;36 37 Person(String name,String age,String sex,String job){38 39 this.name = name;40 41 this.age = age;42 43 this.sex = sex;44 45 this.job = job;46 47 }48 49 }