1. 程式人生 > >Java學習十一,IO流

Java學習十一,IO流

1.什麼是流

     

2.File類的使用

程式碼如下:

package com_imooc.wenjian;

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

public class file_test {
    public static void main(String[] args) {
        //例項化一個file物件
        File f=new File("E:\\專案\\mooc.txt");
        File f1=new File("E:\\專案\\王二狗");
        File f2=new File("E:\\專案\\王大狗\\李二蛋");

        //建立檔案
        try {
            f.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //建立目錄
        f1.mkdir(); //單級別目錄
        f2.mkdirs(); //多級別目錄

        //檢查檔案狀態
        System.out.println("檔案是否是目錄:"+f.isDirectory());
        System.out.println("檔案是否是檔案:"+f.isFile());
        System.out.println("檔案是否是隱藏檔案:"+f.isHidden());
        System.out.println("檔案路徑是否真實存在:"+f.exists());

        //刪除檔案或者目錄
        f1.delete();
    }
}

3.位元組流

InputStream是所有位元組輸入流的祖先,而OutputStream是所有位元組輸出流的祖先。

位元組流分為兩大類:1.InputStream;2.OutputStream;

 

3.1 InputStream

包含有:

我們這裡暫先用FileInputStream作為參考:

實際的程式碼操作:

package com_imooc.wenjian;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class InputStream_test {
    public static void main(String[] args) {
        //建立檔案
        File f = new File("C:\\Users\\Administrator\\Desktop\\mooc.txt");

        //讀取資訊(兩種寫法)
        try {
            FileInputStream info = new FileInputStream("C:\\Users\\Administrator\\Desktop\\mooc.txt");
            FileInputStream info1 = new FileInputStream(f);

            //1.讀取了一個位元組
            int n = info.read();
            System.out.println((char) n);

            System.out.println("====================");

            //2.賦值與位元組陣列讀取
            byte[] b = new byte[20];
            info1.read(b);
            System.out.println(new String(b));

            System.out.println("====================");

            //3.迴圈讀取
            while (n != -1) {
                System.out.print((char) n);
                n = info.read();
            }

            //最後關閉流
            info.close();
            info1.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

 

3.2 OutputStream

包含有:

我們這裡暫先用FileOutputStream作為參考:

package com_imooc.wenjian;

import java.io.*;

public class OutputStream_test {
    public static void main(String[] args) {
        File f = new File("C:\\Users\\Administrator\\Desktop\\mooc1.txt");

        try {
            FileOutputStream info = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\mooc.txt");
            FileInputStream fis1 = new FileInputStream("C:\\Users\\Administrator\\Desktop\\mooc.txt");

            //true是做追加處理,不覆蓋原始檔
            FileOutputStream info1 = new FileOutputStream(f, true);
            FileInputStream fis = new FileInputStream(f);
            //1.寫入單個數據(清空資料後,重新編寫)
            info.write('a');
            info.write('b');
            System.out.println((char) fis1.read());
            System.out.println((char) fis1.read());
            System.out.println("=========================");

            //2.寫入多個數據;
            String st = "cdefgh";
            info.write(st.getBytes());
            int n = fis1.read();
            while (n != -1) {
                System.out.println((char) n);
                n = fis1.read();
            }
            System.out.println("=========================");

            //3.選擇性寫入資料(選取字元1-4的欄位)
            info.write(st.getBytes(),1,4);
            n = fis1.read();
            while (n != -1) {
                System.out.println((char) n);
                n = fis1.read();
            }

            //最後關閉輸入輸出流
            info.close();
            fis.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

3.3 例題

我們採用的是copy的例子來進行程式碼的演示:

    

利用之前學習的位元組流,來把圖中1.png複製一份,並命令為2.png

package com_imooc.wenjian;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class wenjiankaobei {
    public static void main(String[] args) {
        try {
            //1.建立流
            FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\1.png");
            FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\2.png");

            //2.讀入資料並寫入流
            byte[] b = new byte[1024];
            int n = fis.read(b);    //讀入的資料暫存於位元組b
            while (n != -1) {
                fos.write(b, 0, n);
                n = fis.read(b);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

3.4 快取流

package com_imooc.wenjian;

import java.io.*;

public class buffered {
    public static void main(String[] args) {
        File f = new File("C:\\Users\\Administrator\\Desktop\\mooc.txt");
        try {
            //1.建立位元組流(輸入輸出)
            FileInputStream fis = new FileInputStream(f);
            FileOutputStream fos = new FileOutputStream(f);

            //2.建立快取流(輸入輸出)
            BufferedInputStream bis = new BufferedInputStream(fis);
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            //3.快取輸出流(write)
            bos.write(11);
            bos.write('a');
            bos.write('b');
            bos.write('c');
            bos.write("defghi".getBytes());
            bos.flush();    //重新整理緩衝輸出流
            bos.close();    //關閉快取輸出流

            //4.快取輸入流(read)
            System.out.println(bis.read());
            int n=bis.read();
            while (n != -1){
                System.out.println((char) n);
                n=bis.read();
            }
            bis.close();    //關閉快取輸入流

            //5.關閉位元組流
            fis.close();
            fos.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

4.字元流

Reader是所有讀取字串輸入流的祖先,而writer是所有輸出字串的祖先。

 

 

5.位元組流和字元流的區別

    位元組流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進位制資料,它是按位元組來處理的,但實際中很多的資料是文字,又提出了字元流的概念,它是按虛擬機器的Encode來處理,也就是要進行字符集的轉化。這兩個之間通過InputStreamReader,OutputStreamWriter來關聯,實際上是通過byte[]和String來關聯。在實際開發中出現的漢字問題實際上都是在字元流和位元組流之間轉化不統一而造成的。