【206天】黑馬程序員27天視頻學習筆記【Day20-下】

叨逼叨兩句

  1. 在人人都會編程的時代,老程序員的價值在哪裏?編的更熟練嗎?NONONO,必須和新人從不一樣維度競爭。
  2. 跟包容性強的人聊天感受就是好
  3. 清醒的努力+選擇,在3-5年成爲業界80分水準的程序員
  4. 清醒的努力+選擇,在一個方向專研,用10年時間成爲99分的技術專家兼程序員。
  5. 清醒的努力+選擇,用10年時間成爲一個懂金融、懂營銷、會寫做、會演講同時又「剛好會編程「的人。
  6. 大膽列計劃【JavaEE、JavaWeb入行,往大數據方向轉】、JavaScript【業餘學習,應對物聯網】、Python【業餘學習,應對人工智能,並研究研究量化金融】的專家。

20-11:BufferedInputStream和BufferedOutputStream拷貝

  1. 緩衝思想java

    1. 字節流一次讀寫一個數組的速度明顯比一次讀一個字節快不少
  2. BufferedInputStream程序員

    1. BufferedInputStream內置一個緩衝區(數組)
    2. Java程序讀取硬盤上的文件數據時,不會直接從文件將字節往內存中的Java程序輸送,而是使用BufferedInputStream做爲緩衝區,先將文件中字節一次性裝滿BufferedInputStream的8192個字節數組,而後再由Java程序一個個讀取緩衝區的數據
  3. BufferedOutputStream編程

    1. BufferedOutputStream內置一個緩衝區(數組)
    2. Java向硬盤中寫出文件數據時,不會直接從Java程序將數據往硬盤上寫,而是使用BufferedOutputStream做爲緩衝區,先由Java程序一個個將BufferedOutputStream的8192個字節裝滿,而後再將這些字節一次性寫入硬盤上的文件
  4. 原理圖以下:
package com.test.demo001;

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

public class Demo009 {
    public static void main(String[] args) throws IOException{
        //demo01();
        FileInputStream fis = new FileInputStream("20.avi");
        FileOutputStream fos = new FileOutputStream("copy.avi");
        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int b;
        while((b = bis.read())!= -1){
            bos.write(b);
        }
        
        bis.close();
        bos.close();    
    }

    private static void demo01() throws FileNotFoundException, IOException {
        FileInputStream fis = new FileInputStream("cccccc.txt");
        FileOutputStream fos = new FileOutputStream("bbbbbb.txt");
        byte[] arr = new byte[2];
        int len; //讀到的有效字符個數
        while((len = fis.read(arr))!= -1){
            fos.write(arr,0,len);
        }
        fis.close();
        fos.close();
    }
}

20-12:flush和close方法的區別

  1. flush()方法可用來刷新緩衝區,刷新後再次寫出
  2. close()方法用來關閉流釋放資源,若是是帶緩衝區的流對象的close方法,關閉流以前會對緩衝區進行刷新,關閉後也不能再寫出。
  3. 爲何要刷新?由於不刷新數據會留在緩衝區一部分【小於8192字節的那部分】,致使拷貝的文件不完整。
public class Demo009 {
    public static void main(String[] args) throws IOException{
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("20.avi"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
        int b;
        while((b = bis.read())!= -1){
            bos.write(b);
        }
        bis.close();
        bos.close();
    }

20-13:字節流讀寫中文

  1. 字節流讀中文的問題:可能出現讀到半個中文亂碼的狀況數組

    package com.test.demo001;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Demo009 {
        public static void main(String[] args) throws IOException{
            
            FileInputStream fis = new FileInputStream("b.txt");
            byte[] arr = new byte[2];
            int len;
            while((len = fis.read(arr))!= -1){
                System.out.println(new String(arr,0,len));
            }
            
        }
    }
  1. 字節流寫出中文的問題:ide

    1. 字節流直接操做的字節,因此寫出中文必須將字符串轉換成字節數組
    2. 寫出回車換行write(「rn」.getBytes());
    package com.test.demo001;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Demo009 {
        public static void main(String[] args) throws IOException{
            FileOutputStream fos = new FileOutputStream("b.txt");
            fos.write("你好世界".getBytes());
            fos.write("\r\n".getBytes());        
            fos.write("你好世界".getBytes());
            
        }
    }

20-14:流的標準處理異常代碼1.6版本及其之前

package com.test.demo001;

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

public class Demo009 {
    public static void main(String[] args) throws IOException{
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("b.txt");
            fos = new FileOutputStream("c.txt");
            int b;
            while((b = fis.read())!= -1){
                fos.write(b);
            }
        } finally {
            try {
                if(fis != null){
                    fis.close();
                }
            } finally {
                fos.close();
            }
        }
    }
}

20-15:流的標準處理異常代碼1.7版本

  1. ()中的對象必須實現AutoCloseable接口
package com.test.demo001;

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

public class Demo009 {
    public static void main(String[] args) throws IOException{
        try(
            FileInputStream fis = new FileInputStream("b.txt");
            FileOutputStream fos = new FileOutputStream("c.txt");
        ){
            int b;
            while((b = fis.read())!= -1){
                fos.write(b);
            }
        }
    }
}

class MyClose implements AutoCloseable {

    @Override
    public void close() throws Exception {
        System.out.println("我自動關閉了");
    }
    
}

20-16:圖片加密

  1. 將寫出的字節異或一個數,這個數就是密鑰,解密的時候再次異或就能夠了。
package com.test.demo001;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo009 {
    public static void main(String[] args) throws IOException{
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("dd.jpeg"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("ee.jpeg"));
        int len;
        while((len = bis.read())!= -1){
            bos.write(len ^ 123);
        } 
        bis.close();
        bos.close();        
    }
}

20-17:在控制檯錄入文件的路徑,將文件拷貝到當前項目下

package com.test.demo001;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Demo009 {
    public static void main(String[] args) throws IOException{
        
        File file = getFile();
        
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getName()));
        
        int len;
        while((len = bis.read())!= -1){
            bos.write(len);
        } 
        
        bis.close();
        bos.close();        
    }
    
    public static File getFile(){
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入一個文件路徑");
        while(true){
            String line = sc.nextLine();    
            File file = new File(line);
            if(!file.exists()){
                System.out.println("錄入的路徑文件不存在");
            } else if(file.isDirectory()) {
                System.out.println("錄入的路徑是文件夾,請從新輸入");
            } else {
                return file;
            }
        } 
        
    }
    
    
}

20-18:錄入數據,拷貝到文件

package com.test.demo001;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Demo009 {
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(System.in);
        FileOutputStream fos = new FileOutputStream("text.txt");
        System.out.println("請輸入數據:");
        while(true){
            String line = sc.nextLine();
            if("quit".equals(line)){
                break;
            } 
            fos.write(line.getBytes());
            fos.write("\r\n".getBytes());
        }
    }
}
相關文章
相關標籤/搜索