Java項目實戰開發Day16 2020-04-10

內容

1.文件簡介
2.File類使用
3.IO流

一.文件簡介

1.文件是什么東西

文件:可以是目錄(平常理解的文件夾),也可以是具體的文件(文本、圖片、音頻、視頻等等)

2.文件的操作

1.創建文件
2.判斷文件是否存在
3.寫入相應的數據
注意:File沒有具體的讀取和寫入的方法,數據的讀取和寫入通過IO流操作)
4.刪除

3.目錄的操作

1.創建目錄(文件夾)
2.判斷目錄是否存在
3.對目錄進行相應操作(往目錄中copy文件等)
4.刪除目錄

二.File類使用

1.注意點

①File創建出的對象,可以指向指定的一個文件。這個被指向的文件可以存在,也可以不存在。當該文件不存在時,new File(“文件路徑”)不會創建這個文件
②File有專門創建文件和目錄的方法。分別是createNewFile()mkdir()
③可理解為:File是 文件和目錄 路徑名的抽象表示形式

2.File使用示例(針對文件)

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){
  
        //1.讓file對象指向指定的一個文件(有可能存在,也有可能不存在)
        File file = new File("C:\\Users\\劉金豪\\Desktop\\temp");
        //new File并不會創建這個文件
        
        //2.判斷文件是否存在
        if(!file.exists()) {
            //3.創建文件(這段程序在此之前不會真正創建一個文件)
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

            
    }

}

3.File使用示例(針對目錄)

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){
  
        File file = new File("C:\\Users\\劉金豪\\Desktop","newFile");
        
        if(file.exists()) {
            return;
        }
        try {
            //創建目錄
            file.mkdir();
        }catch(NullPointerException e) {
            e.printStackTrace();
        }
        

            
    }

}

4.刪除文件

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){
  
        //1.得到這個文件
        File parent = new File("C:\\\\Users\\\\劉金豪\\\\Desktop");
        File file = new File(parent,"file");
        
        if(file.exists()) {
            file.delete();
        }
 
            
    }

}

5.File中的常用方法

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){
  
        //1.得到這個文件
        File file = new File("C:\\Users\\劉金豪\\Desktop\\newFile");
        
        //2.判斷是文件還是目錄
        if(file.isDirectory()) {
            System.out.println("是目錄");
        }       
        if(file.isFile()) {
            System.out.println("是文件");
        }
        
        //3.1查看當前目錄的所有內容(列出來所有文件的名稱)
        String[] fileNameList = file.list();
        for(String name:fileNameList) {
            System.out.println(name);
        }
        //3.2文件過濾
        String[] fileNameListAccept = file.list(new FilenameFilter() {

            @Override
            public boolean accept(File arg0, String arg1) {
                //返回true,即滿足條件,當前文件就會被過濾出來
                //如果返回false,則不滿足條件,就不會被過濾出來
                //arg0是文件夾的路徑,arg1是文件的名稱
                File f = new File(arg0,arg1);
                
                if(f.isFile()) {
                  return true;
                }
                return false;
            }

        });
        for(String name:fileNameListAccept) {
            System.out.println(name);
        }
        
        //3.3得到file中的文件,并且輸出絕對路徑(與3.2有相通之處)
        File[] files = file.listFiles();
        for(File f:files) {
            System.out.println(f.getAbsolutePath());
        }
    
            
    }

}

輸出結果

文件1
文件2
文件1
文件2
C:\Users\劉金豪\Desktop\newFile\文件1
C:\Users\劉金豪\Desktop\newFile\文件2

三.IO流

1.IO流簡介

輸入流和輸出流不是絕對的,而是相對于內存來說的,再準確一點來說就是相對于內存中正在運行的程序來說的,更精確一點就是相對于正在運行的進程來說的。
輸出:內存 -> 外部(硬盤/網絡/打印機等外部設備)
輸入:外部(硬盤/網絡/打印機等外部設備) ->內存

2.舉例

比如我們常用的復制粘貼,假如把桌面的東西再復制到桌面上,那么會經過:硬盤(也就是這里的桌面)上的目標文件通過輸入流到內存,再通過輸出流到硬盤(也就是這里的桌面)

3.數據的儲存方式(字節和字符)

有兩種:

1.以字節形式存儲 比如:圖片、視頻、音頻、exe(二進制,點開看不懂)
2.以字符形式存儲 比如:文本(點開能看懂)
這兩種數據存儲形式不一樣,那么讀取的方式就不同。如果是二進制文件,那么就需要用字節流讀取。如果是文本,那就可以用字符流讀取

4.字節流和字符流

字節輸入輸出流繼承結構圖

字符輸入輸出流繼承結構圖

①字節輸入輸出流是InputStream 和 OutputStream。這兩個都是抽象類
字符輸入輸出流是 Reader 輸出是Writer。這兩個也是抽象類
②具體實現類
字節流的輸入流FileInputStream 輸出流FileOutputStream
字符流輸入流 FileReader輸出流FileWriter
③注意:當使用IO流時,不需要的資源一般需要自己手動釋放(關閉文件)

5.流的形象理解

可以把流當作水流的通路,創建流就是擰開水龍頭,這個時候水就可以從源頭順著水管流到需要的地方(這里的水就類似Java中的數據,水流的通道即水管就是Java中的流)到時候水流夠了之后就需要關閉水龍頭(也就是關閉流)
向文件中寫入文本

6.字符輸出流使用示例(其余與此類似)

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){
        //1.準備需要寫入的數據
        String text = "hello";//這個已經在內存中存在了
        
        //2.決定是選擇字符流還是字節流(是相當于輸出)   
        FileWriter fw = null;
        try {
            //是把內存中的文本內容寫到磁盤中,所以選擇字符輸出流
            fw = new FileWriter("C:\\Users\\劉金豪\\Desktop\\temp");
            
            //開始寫入數據
            fw.write(text);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {          
            //3.關閉流
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
         
    }

}

注意:凡是實現了closeable接口的類都可以在try(){
}的()里面創建對象
好處:當try代碼塊執行完畢或者有異常的時候,系統會自動關閉對應的對象

7.1使用字節輸入輸出流完成圖片復制粘貼(一次性讀取一個字節)

知識點
①在des里面也要寫上圖片的名稱。如果復制的不是圖片,也需遵守此規則。
②read()不加參數就是一次讀取一個字節,當然也可以加參數,后面代碼會有介紹。當讀取完畢時,返回-1

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){

        //1.保存圖片地址和拷貝到的地址
        String src = "C:\\Users\\劉金豪\\Desktop\\mmexport1566548991556.jpg";
        String des = "C:\\Users\\劉金豪\\Desktop\\newfile\\mmexport1566548991556.jpg";//注意這里,要再寫一個jpg
        
        try (//2.將圖片讀取到內存中(輸入流),因為是圖片,所以是字節流
            FileInputStream fis = new FileInputStream(src);
            
            //3.將內存中的圖片寫到磁盤中(字節輸出流)
            FileOutputStream fos = new FileOutputStream(des);
            ){

            //每次獲取的一個字節
            int b = 0;          
            while(true) {
                //4.從輸入流里面獲取數據,寫入到輸出流
                b = fis.read();//read不加參數是一個字節一個字節讀取
                //一個字節一個字節地寫入內存
                //讀完了就返回-1
                
                //判斷是否讀取完畢
                if(b == -1) {
                    break;
                }
                
                //5.一個字節一個字節地讀出去
                fos.write(b);
                
            }
            
        } catch (Exception e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
    
        
            
    }

}

7.2一次性讀取多個字節

知識點:read的參數一般是數組,如果加了參數,就直接把數據讀入這個參數里面了

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){

        String src = "C:\\Users\\劉金豪\\Desktop\\mmexport1566548991556.jpg";
        String des = "C:\\Users\\劉金豪\\Desktop\\newfile\\mmexport1566548991556.jpg";//注意這里,要再寫一個jpg
        
        try (FileInputStream fis = new FileInputStream(src);
            
            FileOutputStream fos = new FileOutputStream(des);
            ){

            //字節數組,用于保存一次性讀取的多個數據
            byte[] buffer = new byte[1024];//通常定義1024個字節
            
            int len = 0;            
            while(true) {
                //4.從輸入流里面獲取數據,寫入到輸出流
                len = fis.read(buffer);
                
                //判斷是否讀取完畢
                if(len == -1) {
                    break;
                }
                
                //5.一個字節一個字節地讀出去
                fos.write(buffer);//數據讀入buffer里面了
                
            }
            
        } catch (Exception e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
    
        
            
    }

}

8.1使用字符流完成文本復制粘貼

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){

        String src = "C:\\Users\\劉金豪\\Desktop\\temp";
        String des = "C:\\Users\\劉金豪\\Desktop\\newfile\\temp";
        
        try(FileReader fr = new FileReader(src);
            FileWriter fw = new FileWriter(des);){
            while(true) {
                int ch = fr.read();
                if(ch == -1) {
                    break;
                }
                fw.write(ch);
            }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
        
            
    }

}

8.2一次性讀取多個字符(和字節流的基本一樣)

import java.io.*;
import java.util.*;

public class 測試程序   {                                                                                                             
           
    
    public static void main(String[] args){

        String src = "C:\\Users\\劉金豪\\Desktop\\temp";
        String des = "C:\\Users\\劉金豪\\Desktop\\newfile\\temp";
        
        try(FileReader fr = new FileReader(src);
            FileWriter fw = new FileWriter(des);){
            
            char[] buffer = new char[1024];
            while(true) {
                int len = fr.read(buffer);
                if(len == -1) {
                    break;
                }
                fw.write(buffer);
            }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
        
            
    }

}

總結

相比第一次學文件和IO流,這一次非常清晰。捋順了它們之間的關系,總之收獲頗豐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。