java中常見的I/O流總結

Java流操作有關的類或接口:

這裏寫圖片描述

Java流類圖結構:

這裏寫圖片描述

FilInputStream文件輸入流(字節輸入流)
FilterInputStream過濾輸入流(封裝其他輸入流)
BufferInputStream緩衝輸入流
ObjectInputStream 對象輸入流
ByteArrayInputStream字節數組輸入流
PrintStream字節打印流
InputStreamReader轉換流(字節到字符的轉換)
OutStreamWrite轉換流(字符到字節的轉換)
StringWriter 字符輸出流

IO流的分類

根據處理數據類型的不同分爲:字符流和字節流
根據數據流向不同分爲:輸入流和輸出流

字符流和字節流

字節流:以字節爲單位讀取的流
字符流:以字符爲單位讀取的流
字節流和字符流的區別:
讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀多個字節。
處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。
結論:只要是處理純文本數據,就優先考慮使用字符流。 除此之外都使用字節流。

1.1 FileOutputStream類

(1)基本概念
java.io.FileOutputStream類主要用於將字節流數據寫入到輸出流中。
(2)常用的方法
FileOutputStream(String name) - 按照參數指定的路徑構造對象。
FileOutputStream(String name, boolean append) - 按照追加的方式構造對象與指定的路徑關聯。
void write(int b) - 寫入單個字節。
void write(byte[] b, int off, int len) - 寫入數組中的一部分字節數據。 > void write(byte[] b) - 寫入整個數組的字節數據。
void flush() - 刷新輸出流並強制寫入緩衝數據。
void close() - 關閉輸出流並釋放資源。

1.2 FileInputStream類
(1)基本概念
java.io.FileInputStream類用於讀取諸如圖像之類的原始字節流。
(2)常用的方法

FileInputStream(String name) - 根據參數指定的文件進行關聯並創建對象。
int read() - 用於讀取一個字節數據,返回-1表示讀到文件末尾,否則返回數據。
int read(byte[] b) - 用於讀滿整個字節數組。
- 若讀到文件尾就返回-1,否則返回實際讀取的字節數。
int read(byte[] b, int off, int len) - 用於讀滿字節數組的一部分空間。
void close() - 關閉流並釋放資源。
1.3 DataOutputStream類
(1)基本概念

java.io.DataOutputStream類用於將java中的基本數據類型寫入輸出流中。
(2)常用的方法
DataOutputStream(OutputStream out) - 根據參數指定的引用構造對象。
void writeInt(int v) - 用於將參數指定的整數寫入輸出流中。
void flush() - 刷新輸出流 void close() - 關閉輸出流

1.4 DataInputStream類
(1)基本概念
java.io.DataInputStream類用於讀取java中的基本數據類型。
(2)常用的方法

DataInputStream(InputStream in) - 根據參數指定的引用構造對象。
- 引用是一個抽象類,實參需要傳遞子類的對象。
void close() - 關閉輸入流。

1.5 BufferedReader類
(1)基本概念
java.io.BufferedReader類用於讀取單個字符、字符數組、一行字符的數據。
(2)常用的方法

BufferedReader(Reader in) - 根據參數指定的引用構造對象。
- Reader是個抽象類,實參傳遞子類的對(InputStreamReader)。
String readLine() - 用於讀取一行文本。
void close() - 關閉流對象並釋放資源

1.6 PrintStream類

(1)基本概念 java.io.PrintStream類用於打印各種數據內容。
(2)常用的方法 PrintStream(OutputStream out) - 根據參數指定的引用構造對象。
- OutputStream類是個抽象類,實參需要傳遞子類的對象。 >void print(String s) - 打印參數指定的字符串。 void println(String x) - 打印字符串並換行。 void close() -
關閉流。 void flush() - 刷新流對象。

1.7 ObjectOutputStream類

(1)基本概念
   java.io.ObjectOutputStream類用於將一個對象整體寫入到輸出流中。
   只能將支持 java.io.Serializable 接口的對象寫入流中。
   類通過實現 java.io.Serializable 接口以啓用其序列化(將整個對象的所有信息轉換爲字節流信息的過程)功能。

(2)常用的方法
   ObjectOutputStream(OutputStream out) - 根據參數指定的引用構造對象。
      - OutputStream類是抽象類,實參傳遞該類的子類對象。
   void writeObject(Object obj) - 將參數指定的對象整體寫入到流中。
   void flush() - 刷新流對象。
   void close() - 關閉流對象。

1.8 ObjectInputStream類

(1)基本概念
   java.io.ObjectInputStream類用於將文件的對象整體讀取出來。
(2)常用的方法
   ObjectInputStream(InputStream in) - 根據參數指定的引用構造對象。
      - InputStream類是個抽象類,實參需要傳遞子類的對象。
   Object readObject()  - 用於讀取輸入流中的一個對象並返回。
      - 無法根據返回值來判斷是否讀取到文件的末尾。
   void close() - 關閉流對象。

經驗:
當需要向文件中寫入多個對象時,通常的做法是先將所有被寫入的對象放入一個集合中,然後將該集合整體看做一個對象寫入文件中,此時讀取文件中的內容時,只需要調用一次readObject()方法就可以全部讀出。

7.字符流與字節流轉換

轉換流的特點:
1.其是字符流和字節流之間的橋樑
2.可對讀取到的字節數據經過指定編碼轉換成字符
3.可對讀取到的字符數據經過指定編碼轉換成字節 何時使用轉換流?
1.當字節和字符之間有轉換動作時;

2.流操作的數據需要編碼或解碼時。

具體的對象體現:
1.InputStreamReader:字節到字符的橋樑
2.OutputStreamWriter:字符到字節的橋樑 這兩個流對象是字符體系中的成員,它們有轉換作用,本身又是字符流,所以在構造的時候需要傳入字節流對象進來。

8.File類

File類是對文件系統中文件以及文件夾進行封裝的對象,可以通過對象的思想來操作文件和文件夾。
File類保存文件或目錄的各種元數據信息,包括文件名、文件長度、最後修改時間、是否可讀、獲取當前文件的路徑名,判斷指定文件是否存在、獲得當前目錄中的文件列表,創建、刪除文件和目錄等方法。

9.RandomAccessFile類

該對象並不是流體系中的一員,其封裝了字節流,同時還封裝了一個緩衝區(字符數組),通過內部的指針來操作字符數組中的數據。 該對象特點:
1.該對象只能操作文件,所以構造函數接收兩種類型的參數:a.字符串文件路徑;b.File對象。
2.該對象既可以對文件進行讀操作,也能進行寫操作,在進行對象實例化時可指定操作模式(r,rw)

代碼:


鍵入
public static void main(String[] args) {
//1.創建BufferedReader類型的對象與鍵盤輸入(System.in)進行關聯
BufferReader br=new BufferReader(new InputStreamReader(System.in));
PrintStream ps=new Println(new FileOutputStream("c:/a.txt"));
//3.不斷地提示用戶輸入並讀取一行本文,並且寫入到c:/a.txt中
int flage=1;
while(true){
    System.out.println();
    String str=br.readLine();
    if("byte".equals(str))break;
    Date d=new Date();
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh24:mm:ss");
    ps.println(sdf.format(d)+(flage%2==0? "張三說:":"李四說:")+str);
    flage++;
}
ps.flush();
ps.close();
br.close();

讀取數據

public static void main(String[] args){
    //1.創建DataInputStream類的對象與參數指定的文件關聯
    DataInputStream dis=new DataInputStream(new FileInputStream("c:/a.txt"));
    //2.讀取文件中的一個int類型數據並打印出來
    int res=dis.readInt();
    System.out.println("res="+res);
    dis.close();
}
public static void main(String[] args) {

    //1.創建DataOutputStream的對象與參數指定的文件進行關聯
    DataOutputStream dos = new DataOutputStream(
                    new FileOutputStream("c:/a.txt"));
    //2.將整數數據66寫入文件
    dos.writeInt(88);
    //3.關閉輸出流對象
    dos.close();

}

目錄文件打印

public class TestDirPrint {
    //打印指定目錄中的內容,要求子目錄中的內容也要打印出來
    public static void dirPrint(File f){
        //1.若f關聯的是普通文件,則直接打印文件名即可
        if(f.isFile()){
            System.out.println(f.getName());
        }
        //2.若f關聯的是目錄文件,則打印目錄名的同時使用[]括起來
        if(f.isDirectory()){
            System.out.println("[" + f.getName() + "]");
            //3.獲取該目錄中的所有內容,分別進行打印
            File[] ff = f.listFiles();
            for(File ft : ff){
                dirPrint(ft);
            }

        }   
    }
public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestDirPrint.dirPrint(new File("D:/java09/day16"));
        System.out.println(10/0);
    }

}
**複製文件**
public class TestFileCopy {

    public static void main(String[] args) {

        try{
            //1.建立FileInputStream類的對象與源文件建立關聯
            FileInputStream fis 
                = new FileInputStream("D:/java09/day16/javaseday16-IO流常用的類-06.wmv");
            //2.建立FileOutputStream類的對象與目標文件建立關聯
            FileOutputStream fos = new FileOutputStream("c:/javaseday16-IO流常用的類-06.wmv");
            //3.不斷地讀取源文件中的內容並寫入到目標文件中
            /* 可以實現文件的拷貝,但是文件比較大時效率很低
            int res = 0;
            while((res = fis.read()) != -1){
                fos.write(res);
            }
            */
            //第二種方案,根據源文件的大小準備對應的緩衝區(數組),可能導致內存溢出
            //第三種方案,無論文件的大小是多少,每次都準備一個1024整數倍的數組
            byte[] data = new byte[1024 * 8];
            int res = 0;
            while((res = fis.read(data)) != -1){
                fos.write(data, 0, res);
            }
            System.out.println("拷貝文件結束!");
            //4.關閉文件輸入流對象
            fis.close();
            //5.關閉文件輸出流對象
            fos.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}
public class TestFileInputStream {

    public static void main(String[] args) {

        try{
            //1.創建FileInputStream類的對象與指定的文件關聯
            FileInputStream fis = new FileInputStream("c:/a.txt");
            //2.讀取文件中的內容並打印
            /*
            int res = fis.read();
            System.out.println("讀取到的一個字節是:" + res); //h
            System.out.println("\'h\'的ASCII值是:" + (int)'h');

            res = fis.read();
            System.out.println("讀取到的一個字節是:" + res); //e
            System.out.println("\'h\'的ASCII值是:" + (int)'e');
            */
            /*
            int res = 0;
            while((res = fis.read()) != -1){
                System.out.println("讀取到的一個字節是:" + (char)res); //
            }*/
            byte[] data = new byte[10];
            int res = fis.read(data);
            System.out.println("實際讀取到的數據大小是:" 
                + res + ",讀取到的文件內容是:" + new String(data, 0, res) 
                + "!");
            //3.關閉流對象並釋放資源
            fis.close();
        }catch(Exception e){    
            e.printStackTrace();
        }

    }

}

創建文件寫入數據

public class TestFileOutputStream {

    public static void main(String[] args) {

        try{
            //1.創建FileOutputStream類的對象,與指定的文件關聯

            //若文件不存在,則自動創建新的空文件
            //FileOutputStream fos = new FileOutputStream("c:/a.txt", true);
            fos.write("hello".getBytes());
            System.out.println("寫入數據成功!");
            //3.刷新緩衝區並關閉流對象
            fos.flush();
            fos.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

讀取對象object

public class TestObjectInputStream {

    public static void main(String[] args) {

        try{
            //1.創建ObjectInputStream類型的對象與指定的文件關聯
            ObjectInputStream ois = new ObjectInputStream(
                    new FileInputStream("c:/user.dat"));
            //2.讀取文件中的一個對象並打印出來
            Object obj = ois.readObject();
            if(obj instanceof User){
                User user = (User)obj;
                System.out.println(user);
            }
            //3.關閉流對象
            ois.close();
        }catch(Exception e){
            e.printStackTrace();
        }

    }

}
public class TestObjectOutputStream {

    public static void main(String[] args) {

        try{
            //1.創建ObjectOutputStream類的對象與指定的文件關聯
            ObjectOutputStream oos = new ObjectOutputStream(
                    new FileOutputStream("c:/user.dat"));
            //2.準備User類型的對象並進行初始化
            User user = new User("Mark", "123456", "[email protected]");
            //3.將User類型的對象整體寫入到文件中
            oos.writeObject(user);
            System.out.println("寫入對象成功!");
            //4.關閉輸出流對象
            oos.flush();
            oos.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}
發佈了27 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章