24. File類 及I/O操作

1、File類

1.1 概述

  • File類是http://java.io包很重要的一個類;
  • File類的對象可以表示文件,也可以是目錄。
  • File對象只可以對文件或目錄的屬性進行操作,不可以操作文件的具體數(shù)據(jù),即不能對文件進行讀/寫操作。

1.2 構造方法

(1) File(File parent, String child)

從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實例。

(2)File(String pathname)

通過將給定的路徑名字符串轉換為抽象路徑名來創(chuàng)建新的 File實例。

(3) File(String parent, String child)

從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實例。

(4) File(URI uri)

通過將給定的 file: URI轉換為抽象路徑名來創(chuàng)建新的 File實例。

代碼案例:

//創(chuàng)建文件的方法

public class CreateFile {

    public static void main(String[] args) {
        // 創(chuàng)建文件對象。
        File file = new File("D:/FileDemo/FileDemo.txt");
        // 創(chuàng)建文件
        if (!file.exists()) {
            try {
                if (file.createNewFile()) {
                    System.out.println("文件創(chuàng)建成功");
                } else {
                    System.out.println("文件創(chuàng)建失敗");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("文件已存在");
        }

    }

}

//創(chuàng)建目錄的方法

import java.io.File;

public class CreateDirectory {

    public static void main(String[] args) {
        File file = new File("D:\\FileDemo");

        if (!file.exists()) {
            if (file.mkdirs()) {
                System.out.println("創(chuàng)建成功");
            } else {
                System.out.println("創(chuàng)建目錄失敗");
            }
        } else {
            System.out.println("目錄已存在,創(chuàng)建失敗");
        }
    }

}

1.3 常用方法

遍歷方法:

//遍歷方法

import java.io.File;

public class FileList{
    public static void main(String[] args) {
        // 創(chuàng)建目錄對象。
        File file = new File("E:\\");

        // 使用list方法
        String[] fileNameList = file.list();
        
        // 遍歷目錄數(shù)組
        for (String s : fileNameList) {
            System.out.println(s);
        }
        
        System.out.println("------------------------------------");

        // 使用listFiles方法
        File[] fileList = file.listFiles(); 
        
        for (File f : fileList) {
            System.out.println(f.getAbsolutePath());
        }
    }
}

1.4 FileFilter文件過濾器

1.4.1 兩個作用:

(1)過濾不符合規(guī)格的文件名

  • 文件名過濾器接口:interface FilenameFilter
  • 需重寫accept方法自定義過濾規(guī)則

boolean accept(File dir, String name) -- dir:表示文件的當前目錄。 -- name:表示當前目錄的子目錄或者文件的名字。

  • File類中提供了使用文件名過濾器遍歷目錄的方法

String[] list(FilenameFilter filter) -- 把滿足指定過濾條件的文件和目錄,返回到String數(shù)組中。 File[] listFiles(FilenameFilter filter) -- 把滿足指定過濾條件的文件和目錄,返回到File數(shù)組中。

(2)常用于檢測文件是否存在

  • 文件過濾器接口:interface FileFilter
  • 需重寫accept方法自定義過濾規(guī)則,如下:

boolean accept(File pathName) -- pathName:表示當前目錄的子目錄或者文件的名字。

  • File類中提供了使用文件過濾器遍歷目錄的方法:

File[] listFiles(FilenameFilter filter) -- 把滿足指定過濾條件的文件和目錄,返回到File數(shù)組中。

代碼演示:

public class FileFilterDemo {

    public static void main(String[] args) {
        //創(chuàng)建目錄對象
        File dir = new File("D:\\FileDemo");

        //使用"匿名內部類"的方式創(chuàng)建過濾器
        FileFilter filter = new FileFilter() {
            @Override
            public boolean accept(File file) {
                return file.getName().toLowerCase().endsWith(".txt");
            }
        };
        
        File[] files = dir.listFiles(filter);
        
        for (File file : files) {
            System.out.println(file);
        }
    }

}

2、輸入流與輸出流

類:InputStream、OutputStream、Reader、Writer

2.1 流按著數(shù)據(jù)的傳輸方向分為:

  1. 輸入流:往內存中讀叫輸入流。
  2. 輸出流:從內存中往外寫叫輸出流。

(1)所有輸入流都是InputStream類或者Reader類的子類。

  • 類名以InputStream結尾的類都是InputStream的子類。
  • 類名以Reader結尾的類都是Reader類的子類。

(3)所有輸出流都是OutputStream類或者Writer類的子類。

  • 類名以OutputStream結尾的類都是OutputStream的子類。
  • 類名以Writer結尾的類都是Writer類的子類。

2.2 從數(shù)據(jù)流編碼格式上劃分為:

  1. 字節(jié)流:處理單元為1個字節(jié)
  2. 字符流:處理單元為2個字節(jié)

(1)InputStream和OutputStream的子類都是字節(jié)流

  • 可以讀寫二進制文件,主要處理音頻、圖片、歌曲、字節(jié)流,處理單元為1個字節(jié)。

(2)Reader和Writer的子類都是字符流

  • 主要處理字符或字符串,字符流處理單元為2個字節(jié)。
  • 字節(jié)流將讀取到的字節(jié)數(shù)據(jù),去指定的編碼表中獲取對應文字。

由于上述兩種分類都是針對InputStream、OutputStream、Reader、Writer四個類,所以代碼案例寫在一起

代碼案例:

//字節(jié)輸入流(FileInputStream)

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

public class FileInputStreamDemo {

    public static void main(String[] args) {
    
        //建立文件對象
        File file=new File("C:\\Users\\25849\\Desktop\\1.txt"); 
   
        try
        {
            //建立鏈接
            FileInputStream fileInputStream=new FileInputStream(file);
            
            int  n=0; 
            
            StringBuffer sBuffer=new StringBuffer();
 
            while (n!=-1)  //當n不等于-1,則代表未到末尾
            {
                
               n=fileInputStream.read();//讀取文件的一個字節(jié)(8個二進制位),并將其由二進制轉成十進制的整數(shù)返回
              
               char by=(char) n; //轉成字符
               
               sBuffer.append(by);
 
            }
           System.out.println(sBuffer.toString());
   
        }
        catch (FileNotFoundException e)
        {
          
           System.out.println("文件不存在或者文件不可讀或者文件是目錄");
        }
        catch (IOException e)
        {
           System.out.println("讀取過程存在異常");
        } 
    }
}

結果:由于文件存的是字符類型,以字節(jié)形式讀取,會把原本的字符分解為兩個字節(jié),所以亂碼了

????¤§???????¤§asfsa???
sdg sgdf???dfhfh
?¤§?????????????????¨é??
?????¨é???????¨é??sf?

//字節(jié)輸出流(FileOutputStream)

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

public class FileOutputStreamDemo {

    public static void main(String[] args) {
        // 建立文件對象
        File file = new File("C:\\Users\\25849\\Desktop\\1.txt");

        try {
            String content = "我生來堅強\n只要不死\n我就笑得猖狂";
            FileOutputStream out = new FileOutputStream(file, true);
            out.write(content.getBytes());
            System.out.println("寫入成功");
        }

        catch (FileNotFoundException e) {

            System.out.println("文件不存在或者文件不可讀或者文件是目錄");
        } catch (IOException e) {
            System.out.println("讀取過程存在異常");
        }
    }
}

結果:

寫入成功
在沒有實力之前,你要學會比狼能忍
在有了實力之后,你要學會比狼更狠我生來堅強我生來堅強
只要不死
我就笑得猖狂

//字符輸入流(FileReader)

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

public class FileReaderDemo2 {

    public static void main(String[] args) {

        // 建立文件對象
        File file = new File("C:\\Users\\25849\\Desktop\\1.txt");

        try {
            // 建立鏈接
            FileReader fileReader = new FileReader(file);
            int n = 0;

            char[] chars = new char[10];
            String s ;

            while ((n = fileReader.read(chars)) != -1) // 當n不等于-1,則代表未到末尾
            {
                String string = new String(chars,0,n);
                
                System.out.println(string);

            }

        } catch (FileNotFoundException e) {

            System.out.println("文件不存在或者文件不可讀或者文件是目錄");
        } catch (IOException e) {
            System.out.println("讀取過程存在異常");
        }
    }
}

//字符輸出流(FileWriter)

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo2 {

    public static void main(String[] args) {
        FileWriter filewriter = null;
        try {

            filewriter = new FileWriter("C:\\Users\\25849\\Desktop\\1.txt",true);

            String content = "abcdefghigklmn";
            
            filewriter.write( content );
        
        } catch (IOException e1) {
            e1.printStackTrace();
        }finally{
            try {
                //清空緩存區(qū)
                filewriter.flush();
                //關閉“文件字符輸出流”
                filewriter.close();
                System.out.println("寫入成功!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

2.3 從封裝類型不同分為:

  1. 節(jié)點流:如果流封裝的是某種特定的數(shù)據(jù)源,如文件、字符串、字符串數(shù)組等,則稱為節(jié)點流。
  2. 處理流:如果流封裝的是其它流對象,稱為處理流。處理流提供了緩沖功能,提高讀寫效率。

(1)節(jié)點流中常用類

  • 字節(jié)輸入流 FileInputStream
  • 字節(jié)輸出流 FileOutputStream
  • 字符輸入流 FileReader
  • 字符輸出流 FileWriter

(2)處理流中常用類

  • 緩沖字節(jié)輸出流 BufferedOutputStream
  • 緩沖字節(jié)輸入流 BufferedInputStream
  • 緩沖字符輸入流 BufferedReader
  • 緩沖字符輸出流 BufferedWriter

上面的節(jié)點流就是之前描述的,在這里著重描述處理流

2.3.1 處理流:

1.緩沖區(qū)原理:

-緩沖區(qū)的概念。

-緩沖區(qū)的作用:要對操作的數(shù)據(jù)進行臨時的緩存,提高了讀寫效率。

-緩沖區(qū)如何提高讀寫效率。

2.處理流的特點:

  • 字符緩沖輸入流提供了讀取一行的方法readLine() 。
  • 字符緩沖輸出流提供了寫入一個空行的方法newLine()。
  • 字符緩沖輸出流,把寫入的數(shù)據(jù)先寫入到內存,再使用flush()方法將內存數(shù)據(jù)刷到硬盤上。

注意:在使用字符緩沖輸出流時,一定先flush(),然后再close(),避免數(shù)據(jù)的丟失。

代碼案例:

//緩沖字節(jié)輸入處理流(BufferedInputStream)

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

public class BufferedInputStreamDemo2 {

    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        BufferedInputStream bufferedInputStream = null;
        try {
            fileInputStream = new FileInputStream("C:\\Users\\25849\\Desktop\\1.txt");
            
            bufferedInputStream = new BufferedInputStream(fileInputStream);     

            byte[] bytes = new byte[16];
    
            int length = 0;
        
            while ((length = bufferedInputStream.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, length));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedInputStream.close();
                System.out.println("讀取完成!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

//緩沖字節(jié)輸出處理流(BufferedOutputStream)

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

public class BufferedOutputStreamDemo2 {

    public static void main(String[] args) {

        FileOutputStream fileOutputStream = null;

        BufferedOutputStream bufferedOutputStream = null;
        try {

            fileOutputStream = new FileOutputStream("C:\\Users\\25849\\Desktop\\1.txt");

            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);

            String content = "abcdefghigklmn";

            byte[] bytes = content.getBytes();

            bufferedOutputStream.write(bytes);

            System.out.println("寫入成功!");
        } catch (IOException e) {

            e.printStackTrace();

        } finally {
            try {
                // 刷新 “緩沖字節(jié)輸出處理流”
                bufferedOutputStream.flush();
                // 關閉 “緩沖字節(jié)輸出處理流”
                bufferedOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

//緩沖字符輸入處理流(BufferedReader)

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo2 {

    public static void main(String[] args) {

        FileReader fileReader = null;
    
        BufferedReader bufferedReader = null;
        try {
    
            fileReader = new FileReader("C:\\Users\\25849\\Desktop\\1.txt");
    
            bufferedReader = new BufferedReader(fileReader);
    
            String content = null;
            int length = 0;
            
            while ((content = bufferedReader.readLine()) != null) {
    
                System.out.println(content);
            }

        } catch (IOException e) {

            e.printStackTrace();
        } finally {

            try {
                //關閉  “字符輸入處理流”
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

//緩沖緩沖字符輸出處理流(BufferedWriter )

2.4 節(jié)點流和處理流速度的對比

//用字節(jié)節(jié)點流復制一個視頻

package com.company.project.homework.h11;

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

import javax.xml.crypto.Data;

//復制兩個視頻文件
//字節(jié)流
//用節(jié)點流

public class Demo2 {
    public static void main(String[] args) throws IOException {
        
        long now = System.currentTimeMillis();
        
        FileInputStream fis = new FileInputStream("D:\\ChromeCoreDownloads\\VN1v5.mp4");
        FileOutputStream fos ;
        
        File newfile = new File("D:\\ChromeCoreDownloads\\VN1v5ss.mp4");
        if(!newfile.exists()) {
            newfile.createNewFile();
        }
        fos = new FileOutputStream(newfile);

        
        byte[] by = new byte[128];
        int num = 0 ;
        while ((num = fis.read(by)) != -1) {
            fos.write(by,0,num);
            
        }
        System.out.println("復制完成");
        System.out.println("使用時間:" + (System.currentTimeMillis() - now));
        fos.close();
        fis.close();
        
    }
}

結果:

復制完成
使用時間:203

//用字節(jié)處理流復制同一個視頻

package com.company.project.homework.h11;

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

import javax.xml.crypto.Data;

//復制兩個視頻文件
//字節(jié)流
//用處理流

public class Demo {
    public static void main(String[] args) throws IOException {
        
        long now = System.currentTimeMillis();
        
        FileInputStream fis = new FileInputStream("D:\\ChromeCoreDownloads\\VN1v5.mp4");
        FileOutputStream fos ;
        
        File newfile = new File("D:\\ChromeCoreDownloads\\VN1v5ss.mp4");
        if(!newfile.exists()) {
            newfile.createNewFile();
        }
        fos = new FileOutputStream(newfile);
        
        
        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        
        byte[] by = new byte[128];
        int num = 0 ;
        while ((num = bis.read(by)) != -1) {
            bos.write(by,0,num);
            
        }
        System.out.println("復制完成");
        System.out.println("使用時間:" + (System.currentTimeMillis() - now));
        bos.close();
        bis.close();
        fos.close();
        fis.close();
        
    }
}

結果:

復制完成
使用時間:15

明顯速度提升了很多?。。?!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容