1. 程式人生 > >關於IO的一些總結與體會

關於IO的一些總結與體會

常用的3種,其中抽象基類和訪問檔案屬於節點流,緩衝流屬於處理流
IO流是用來處理裝置與程式之間的資料傳輸。
按流向分為:
輸入流:OutputStream和Writer為基類。
輸出流:InputStream和Reader為基類。
按處理的單位分為:
位元組流:InputStream基類。
字元流:OutputStream基類。
按流的角色分為:
節點流:可以從一個特定的 IO 裝置讀/寫資料的流(訪問檔案相關,也叫檔案流,程式直接作用在檔案上)。
處理流:對一個已存在的流進行連線和封裝,通過封裝後的流來實現資料讀/寫操作。
一、在訪問檔案使用FileInputStreamOutputStream時的步驟為:
1.建立一個File類的物件;
2.建立一個FileInputStream類或FileOutputStream類的物件;
3.呼叫FileInputStream或FileOutputStream中的方法,實現file檔案的讀取或寫入;
4.關閉相應的流(遵循先開後關的準則)。

package com.hpe.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
 * 類描述:測試輸入流
 * 作者: author  
 * 建立日期:2018年8月15日
 * 修改人:
 * 修改日期:
 * 修改內容:
 * 版本號: 1.0.0
 */
public class TestFileInputStream {
    public static void main(String[] args) {
        FileInputStream fis=null
; try { File file=new File("hello.txt"); fis=new FileInputStream(file); // 將讀取到的資料寫入陣列 byte[] b=new byte[5]; // 每次讀入到byte中位元組的長度 int len; while ((len=fis.read(b))!=-1) { for (int i = 0; i <len; i++) { // 由於byte中儲存的是該字元在ASCII程式碼中對應的十進位制值
// 因此需要轉換成char才能將字元顯示出來 System.out.print((char)b[i]); } } } catch (Exception e) { e.printStackTrace(); }finally { if (fis!=null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
package com.hpe.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 類描述:測試輸出流
 * 作者: author  
 * 建立日期:2018年8月15日
 * 修改人:
 * 修改日期:
 * 修改內容:
 * 版本號: 1.0.0
 */
public class TestFileOutputStream {
    public static void main(String[] args) {
        // 1.建立一個File物件,指定要寫入的檔案位置
        FileOutputStream fos = null;
        try {
            File file = new File("hello2.txt");
            // 2.建立一個FileOutputStream物件,將file的物件作為形參傳遞給構造器中
            fos = new FileOutputStream(file);
            // 3.寫入操作將字串轉為位元組陣列
            String str = new String("hello");
            fos.write(str.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 4.關閉輸出流
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

二、使用BuffererInputStreamBufferedOutputStream時的步驟:
1.提供讀入、寫出的檔案;
2.建立響應節點流FileInputStream FileOutputStream;
3.將建立的節點流的物件作為形參傳遞給緩衝流的構造器中;
4.呼叫BuffererInputStream的 read()方法和BufferedOutputStream的write()方法;
5.關閉相應的流(遵循先開後關的準則)。

package com.hpe.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * 類描述:測試緩衝流
 * 作者: author  
 * 建立日期:2018年8月15日
 * 修改人:
 * 修改日期:
 * 修改內容:
 * 版本號: 1.0.0
 */
public class TestBufferedInputOutputStream {
    public static void main(String[] args) {
        // 使用BuffererInputStream和BufferedOutputStream
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            // 1.提供讀入、寫出的檔案
            File file1 = new File("1.jpg");
            File file2 = new File("3.jpg");
            // 2.建立響應節點流FileInputStream FileOutputStream
            FileInputStream fis = new FileInputStream(file1);
            FileOutputStream fos = new FileOutputStream(file2);
            // 3.將建立的節點流的物件作為形參傳遞給緩衝流的構造器中
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);
            // 4.實現檔案複製
            byte[] b = new byte[1024];
            int len;
            // 讀取檔案
            while ((len = bis.read(b)) != -1) {
                // 寫入檔案
                bos.write(b, 0, len);
                // 重新整理資料
                bos.flush();
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        } finally {
            // 5.關閉流
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

1).對於非文字檔案只能使用位元組流進行處理。
2).要讀取的檔案必須得存在,寫入的檔案可以不存在(不存在的話會自動建立)。
3).緩衝流可以提高檔案操作的效率。