1. 程式人生 > >File類IO操作(二)

File類IO操作(二)

FileReader

/*
位元組流:位元組流讀取的是檔案中的二進位制資料,讀到的資料並不會幫你轉換成你看得懂的字元。 

字元流: 字元流會把讀取到的二進位制的資料進行對應 的編碼與解碼工作。   字元流 = 位元組流 + 編碼(解碼)

輸入字元流:
----------| Reader 輸入字元流的基類   抽象類
-------------| FileReader 讀取檔案的輸入字元流。


FileReader的用法:
    1. 找到目標檔案
    2. 建立資料的輸入通道
    3. 讀取資料
    4. 關閉資源



 */
public class Demo2 {

    public
static void main(String[] args) throws IOException { readTest2(); } //使用緩衝字元陣列讀取檔案。 public static void readTest2() throws IOException{ //找到目標檔案 File file = new File("F:\\1208project\\day21\\src\\day21\\Demo1.java"); // 建立資料的輸入通道 FileReader fileReader = new
FileReader(file); //建立緩衝字元陣列讀取檔案資料 char[] buf = new char[1024]; int length = 0 ; while((length = fileReader.read(buf))!=-1){ System.out.print(new String(buf,0,length)); } } public static void readTest1() throws IOException{ //找到目標檔案 File file = new
File("F:\\Demo1.java"); //建立資料的輸入通道 FileReader fileReader = new FileReader(file); int content = 0 ; while((content = fileReader.read())!=-1){ //每次只會讀取一個字元,效率低。 System.out.print((char)content); } //關閉資源 fileReader.close(); } }

FileWriter


/*
輸出字元流:

------| Writer 輸出字元流的基類。 抽象類
-----------| FileWriter 向檔案資料資料的輸出字元流

FileWriter的使用步驟:
    1. 找到目標檔案。
    2. 建立資料輸出通道
    3. 寫出資料。
    4. 關閉資源

FileWriter要注意的事項:
    1. 使用FileWriter寫資料的時候,FileWriter內部是維護了一個1024個字元陣列的,寫資料的時候會先寫入到它內部維護的字元陣列中,如果需要
    把資料真正寫到硬碟上,需要呼叫flush或者是close方法或者是填滿了內部的字元陣列。
    2. 使用FileWriter的時候,如果目標檔案不存在,那麼會自動建立目標檔案。
    3.使用FileWriter的時候, 如果目標檔案已經存在了,那麼預設情況會先情況檔案中的資料,然後再寫入資料 , 如果需要在原來的基礎上追加資料,
    需要使用“new FileWriter(File , boolean)”的構造方法,第二引數為true。


練習: 使用字元流拷貝一個文字檔案(java檔案). 
接著使用字元流拷貝一個圖片(觀察圖片的大小變化,思考為什麼會這樣子??)

 */
public class Demo1 {

    public static void main(String[] args) throws IOException {
        writeTest1();
    }

    public static void  writeTest1() throws IOException{
        //找到目標檔案
        File file = new File("F:\\a.txt");
        //建立資料輸出通道
        FileWriter fileWriter = new FileWriter(file,true);
        //準備資料,把資料寫出
        String data = "今天天氣非常好!!";
        fileWriter.write(data);  //字元流具備解碼的功能。
        //重新整理字元流
//      fileWriter.flush();
        //關閉資源
        fileWriter.close();



    }
}

使用位元組流讀取中文


public class Demo2 {

    public static void main(String[] args) throws IOException {
        File file = new File("F:\\a.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] buf = new byte[1024];
        int length = 0;
        while((length = fileInputStream.read(buf))!=-1){
            System.out.println(new String(buf,0,length)); //借用字串的解碼功能。
        }
    }
}
/*
何時使用字元流,何時使用位元組流?依據是什麼?

使用字元流的應用場景: 如果是讀寫字元資料的時候則使用字元流。

使用位元組流的應用場景: 如果讀寫的資料都不需要轉換成字元的時候,則使用位元組流。 


 */
//使用字元流拷貝檔案
public class Copy {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader("F:\\Test.txt"));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("E:\\Test.exe"));
        String line=null;
        while((line = bufferedReader.readLine())!=null){
        bufferedWriter.write(line);
        }
        bufferedWriter.close();
        bufferedReader.close();
    }
}

自己實現readLine方法

/*
輸入字元流:
-------| Reader 所有輸入字元流的基類。 抽象類
----------| FileReader 讀取檔案字串的輸入字元流。
----------| BufferedReader   緩衝輸入字元流  。 緩衝 輸入字元流出現的目的是為了提高讀取檔案 的效率和拓展了FileReader的功能。  其實該類內部也是維護了一個字元陣列

記住:緩衝流都不具備讀寫檔案的能力。

BufferedReader的使用步驟:
    1.找到目標檔案
    2 .建立資料的輸入通道。




 */
public class Demo1 {

    public static void main(String[] args) throws IOException {
//       readTest1();
        File file  = new File("F:\\a.txt");
        //建立資料的輸入通道。
        FileReader fileReader = new FileReader(file);
        String line =  null;

        while((line = myReadLine(fileReader))!=null){
            System.out.println(line);
        }
    }



    //自己去實現readLine方法。
    public static String myReadLine(FileReader fileReader) throws IOException{
        //建立一個字串緩衝類物件
        StringBuilder sb = new StringBuilder();  //StringBuilder主要是用於儲存讀取到的資料
        int content = 0 ;
        while((content = fileReader.read())!=-1){
            if(content=='\r'){
                continue;
            }else if(content=='\n'){
                break;
            }else{
                //普通字元
                sb.append((char)content);
            }
        }
        //代表已經讀取完畢了。
        if(content ==-1){
            return null;
        }

        return sb.toString();  
    }







    public static void readTest1() throws IOException{
        //找到目標檔案
        File file  = new File("F:\\a.txt");
        //建立資料的輸入通道。
        FileReader fileReader = new FileReader(file);
        //建立緩衝輸入字元流
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        //讀取資料
        /*int content = bufferedReader.read();  //讀到了一個字元。 讀取到的字元肯定也是從Bufferedreader內部的字元陣列中獲取的到。所以效率高。
        System.out.println((char)content);*/
        //使用BUfferedReader拓展的功能,readLine()  一次讀取一行文字,如果讀到了檔案的末尾返回null表示。
        String line =  null;
        while((line = bufferedReader.readLine())!=null){ // 雖然readLine每次讀取一行資料,但是但會的line是不包含\r\n的、
            System.out.println(Arrays.toString("aaa".getBytes()));
        }
        //關閉資源
        bufferedReader.close();

    }

}

BufferedWriter


/*
輸出字元流
----------| Writer  所有輸出字元流的基類,  抽象類。
--------------- | FileWriter 向檔案輸出字元資料的輸出字元流。 
----------------| BufferedWriter 緩衝輸出字元流          緩衝輸出字元流作用: 提高FileWriter的寫資料效率與拓展FileWriter的功能。
BufferedWriter內部只不過是提供了一個8192長度的字元陣列作為緩衝區而已,拓展了FileWriter的功能。

BufferedWriter如何使用?
    1. 找到目標檔案
    2. 建立資料的輸出通道



 */
public class Demo2 {

    public static void main(String[] args) throws IOException {
        //找到目標檔案
        File file = new File("F:\\a.txt");
        //建立資料的輸出通道
        FileWriter fileWriter = new FileWriter(file,true);
        //建立緩衝輸出流物件
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); 
        //寫出資料
//      bufferedWriter.newLine(); //newLine() 換行。 實際上就是想檔案輸出\r\n.
        bufferedWriter.write("\r\n");
        bufferedWriter.write("前兩天李克強來!!");
        //關閉資源
        bufferedWriter.flush();
//      bufferedWriter.close();

    }
}

練習: 緩衝輸入輸出字元流使用者登陸註冊,將資訊儲存在文字


public class Login {

    static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        while(true){
            System.out.println("請選擇功能: A(註冊)   B(登陸)");
            String option =  scanner.next();
            if("a".equalsIgnoreCase(option)){
                //註冊
                reg();

            }else if("b".equalsIgnoreCase(option)){
                //登陸
                login();

            }else{
                System.out.println("你的輸入有誤,請重新輸入...");
            }   
        }
    }


    //登陸
    public static void login() throws IOException{
        System.out.println("請輸入使用者名稱:");
        String userName = scanner.next();
        System.out.println("請 輸入密碼:");
        String password = scanner.next();
        String info = userName+" "+ password;
        //讀取檔案的資訊,檢視是否有該使用者的資訊存在,如果存在則登陸成功。
        //建立資料的輸入通道
        //建立緩衝輸入字元流
        BufferedReader bufferedReader = new BufferedReader(new FileReader("F:\\users.txt"));
        String line = null;

        boolean isLogin = false; // 用於記錄是否登陸成功的標識, 預設是登陸失敗的。
        //不斷的讀取檔案的內容
        while((line = bufferedReader.readLine())!=null){
            if(info.equals(line)){
                isLogin = true;
                break;
            }
        }

        if(isLogin){
            System.out.println("歡迎"+userName+"登陸成功...");
        }else{
            System.out.println("不存在該使用者資訊,請註冊!!");
        }



    }




    //註冊
    public static void reg() throws IOException{
        System.out.println("請輸入使用者名稱:");
        String userName = scanner.next();
        System.out.println("請 輸入密碼:");
        String password = scanner.next();
        String info = userName+" "+ password;
        //把使用者的註冊的資訊寫到檔案上
        File file = new File("F:\\users.txt");
        FileWriter fileWriter = new FileWriter(file,true);
        //建立緩衝輸出字元流
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        //把使用者資訊寫出

        bufferedWriter.write(info);
        bufferedWriter.newLine();
        //關閉資源
        bufferedWriter.close();

    }

}