天天看點

java入門篇(22)輸入輸出流一、IO流二.FileOutputStream類三.FileInputStream類四.BufferedOutputStream高效輸出流5.案例

一、IO流

1.1 IO流的概述

IO流是對裝置之間傳輸資料的抽象,java通過IO流對資料進行各種各樣的操作,而對資料進行操作的"對象"都在IO包裡。

1.2 IO流的分類

a.按照資料流向

輸入流 讀入資料
輸出流 寫出資料

b.按照資料類型

位元組流 Java中的位元組流處理的最基本機關為單個位元組
字元流 Java中的字元流處理的最基本的單元是字元

1.3 IO流基類概述和FileOutputStream的構造方法

  • 位元組流的抽象基類:
  • InputStream
  • OutputStream
  • 字元流的抽象基類:
  • Reader
  • Writer

注:由這四個類派生出來的子類的名稱是使用該四個類類名作為字尾。

1.4 OutputStream基類的常用字類

  • FileOutputStream
  • OutputStream
  • ByteArrayOutputStream

二.FileOutputStream類

2.1 FileOutputStream類的構造方法

  • FileOutputStream(File file)

    建立一個指向----File類對象表示的檔案----的寫入資料的輸出流

  • FileOutputStream(String name)

    建立一個----字元串表示的檔案----的寫入資料的輸出流

注意事項:

i: 建立位元組輸出流對象了做了幾件事情?(如a.txt)

  • 調用系統資源建立a.txt對象
  • 建立fos對象
  • 将fos對象指向這個檔案

ii:調用close()方法的作用

  • 通知系統釋放關于a.txt的資源
  • 讓IO流對象變成垃圾,等待垃圾回收器對其回收。

2.2 FileOutputStream的三個write()方法

  • public void write(int b)

    将指定位元組寫入此檔案輸出流

  • public void write(byte[] b)

将位元組數組寫入此檔案輸出流

  • public void write(byte[] b,int off,int len)

将位元組數組的一部分寫入此檔案輸出流

注意:檔案的編碼格式一定要一緻,否則會出現亂碼的情況。

2.3 FileOutputStream寫出資料實作換行和追加寫入

  • 換行
windows \r\n
Linux \n
Mac \r
  • 資料的追加寫入

    FileOutputStream(File file, boolen append)

    傳入的第二個參數為true即可

2.4 FileOutputStream寫出資料加入異常處理

注意:檔案輸入流是否打開,如果未打開,就不用進行關閉,否則會出錯。

public class File_class {
    public static void main(String[] args) {
        FileOutputStream f = null;
        try {
            f = new FileOutputStream("a.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            f.write(new byte[]{'q', 'w', 'e', 'r'});
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            {
               if(f!=null) {
                   try {
                       f.close();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
            }
        }
    }
}


           

三.FileInputStream類

3.1 FileStream類讀取資料

  • 一次讀取一個位元組

//讀取内容需要将int類型的位元組強制轉換成char類型進行輸出。

public class read1 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("a");
        int len = 0;
        while((len = in.read()) != -1) {
        System.out.print((char)len);
        }
        in.close();
    }
}

           
  • 一次讀取一個位元組數組

注意:String導包出錯也會出錯。

public class read1 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("a");
        int len = 0;
        byte[] bytes = new byte[1024];
        while((len = in.read(bytes)) != -1) {
        System.out.println(new String(bytes));
        }
        in.close();
    }
}
           

四.BufferedOutputStream高效輸出流

4.1 緩沖區

  • 概念

    指記憶體中預留的指定大小(size)的存儲空間(對I/O流的資料作臨時存儲)。

  • 作用

    1.減少實際實體讀寫次數

    2.緩沖區在建立時就被配置設定記憶體,這塊記憶體區域一直被重用,可以減少動态配置設定和回收記憶體的次數。

4.2 BufferedOutputStream構造方法

  • BufferedOutputStream(OutputStream out)

    建立一個新的緩沖輸出流,以将資料寫入新的底層輸出流。

  • BufferedOutputStream(OutputStream out, int size)

    建立一個新的緩沖輸出流,以将具有定緩沖區大小的資料寫入到底層輸出流。

5.案例

5.1将指定目錄下的以".txt"結尾的檔案的名字輸出到螢幕上

注:用接口FilenameFilter完成

基本思想:

1.獲得檔案清單

2.便利檔案清單,是檔案,判斷是不是符合要求的檔案。

3.是檔案夾,進入第一步,進行遞歸

public class FIlefind {
    public static void main(String[] args) {
        File file = new File("C:\\Drcom");
        find(file);

    }

    private static void find(File file) {
        File[] f = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File newFile = new File(dir, name);
                if (newFile.isFile() && name.endsWith(".txt")) {
                    return true;    
                } else if (newFile.isDirectory()) {
                    find(newFile);    //遞歸開始
                    return false;
                } else
                    return false;
            }
        });
        for(File file2 : f) {
            System.out.println(file2.getName());
        }
    }
}

           
  • 解析

    FileNameFilter接口的access()方法在本程式中的作用是判斷FIle類對象是不是檔案,并且是不是以".txt"為字尾的檔案,如果是,将符合要求的檔案放入到File[] f這個FIle對象數組裡,調用本身方法那裡是遞歸開始,如果File對象是檔案夾,将該對象作為參數,傳入到find()方法裡,再獲得該檔案夾裡面的資源清單再進行判斷是不是檔案或者檔案夾…遞歸到最裡層,符合的檔案名輸出,退一層,輸出,直到回到遞歸入口。

  • 注意事項:

    在遞歸入口下面要reuturn false,因為方法是boolean類型傳回值,不然會出錯,記住隻有符合條件的檔案對象那個return true就會好了解多。

5.2 計算指定路徑的檔案及檔案夾數

public static void findTex(File file) {
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile() && f.getName().endsWith(".txt")) {
                System.out.println(f.getName());
            }
            if (f.isDirectory()) {
                findTex(f);
            }
        }
    }
}
           

5.3 複制檔案夾,包括複制檔案

//單個複制檔案
public class file_copy {
    public static int count = 1;
    public static int amount = 0;
    public static void file_Copy(String src, String des) throws IOException {
        FileInputStream inputStream = new FileInputStream(src);
        FileOutputStream outputStream = new FileOutputStream(des);
        byte[] array = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(array)) != -1) {
            outputStream.write(array);
        }
        inputStream.close();
        outputStream.close();
    }
    //對目錄的複制,對剛開始是檔案不适用
    public static void directory_Copy(String src, String des) throws IOException {
        File file_src = new File(src);
        File file_des = new File(des);
        //是檔案,複制
        if(file_src.isFile()){
            file_Copy(src, des);
            System.out.println("操作了第" + count++ + "個檔案");
        }
        if(file_src.isDirectory()){
            if(!file_des.exists()) {
                file_des.mkdir();
                System.out.println("操作了第" + count++ + "個檔案");
            }
            File[] files = file_src.listFiles();
            for(File f : files){
                //更新新位址,更新目标位址
                String src_new = f.getAbsolutePath();
                String des_new = des + src_new.substring(src.length());
                directory_Copy(src_new,des_new);
            }
        }
    }
           

參考:http://www.cnblogs.com/absfree/p/5415092.html

https://blog.csdn.net/u012635648/article/details/73467226