日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

IO流詳解之字符流與File類

作者:草原灰太狼666 更新時間: 2022-07-13 編程語言

IO流

1.字符流簡介

  • 字符流核心組成
    • 核心組成:Reader–> 字符輸入流、Writer–> 字符輸出流、BufferedReader–>字符緩沖流讀取文件、BufferedWriterr–>字符緩沖流文寫入件

  • 字符流

    • 字節(jié)流能操作所有文件,而字符流操作文本文件比較方便
    • 解決了亂碼問題
  • 字節(jié)流與字符流的區(qū)別:

    • 在所有的流操作里。字節(jié)永遠是最基礎(chǔ)的。任何基于字節(jié)的操作都是正確的

    • 無論你是文本文件還是二進制的文件。如果確認流里面只有可打印的字符,包括英文的和各種國家的文字,也包括中文,那么可以考慮用字符流。由于編碼不同,多字節(jié)的字符可能占用多個字節(jié)。比如GBK的漢字就占用2個字節(jié),而UTF-8的漢字就占用3個字節(jié)。所以,字符流是根據(jù)指定的編碼,將1個或多個字節(jié)轉(zhuǎn)化為java里面的unicode的字符,然后進行操作

    • 字符操作一般使用Writer,Reader等

    • 字節(jié)操作一般都是InputStream,OutputStream以及各種包裝類,比如BufferedlnputStream和BufferedOutputStream等。

    • 如果你確認你要處理的流是可打印的字符,那么使用字符流會看上去簡單一點。如果不確認,那么用字節(jié)流總是不會錯的。

    • 一般操作非文本文件時,使用字節(jié)流;操作文本文件時,建議使用字符流。

2.字符流抽象類常見方法

2.1字符流抽象類

  • reader:字符輸入流

    • public int read(){}
    • public int read(char[] c){}
    • public int read(char[] b, int off, int len){}
  • Writer: 字符輸出流

    • public void write(int n){}
    • public void write(String str){}
    • public void write(char[] c){}

2.2文件字符流

  • FileReader:

    • public int read(char[] c) // 從流中讀取多個字符,將讀到的內(nèi)容存入 c 數(shù)組,返回實際讀到的字符數(shù);如果達到文件的尾部,則返回 -1
  • FileWriter:

    • public void write(String str) // 一次寫多個字符,將所有字符寫入輸出流

2.21 使用字節(jié)流讀取文本文件代碼演示

package stream.demo02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
// 傳統(tǒng)字節(jié)流讀取txt中文文本
/*
使用傳統(tǒng)字節(jié)流讀中文文本,會出現(xiàn)亂碼問題。因為字節(jié)流讀入文件內(nèi)容時是按照一個字節(jié)一個字節(jié)來讀。
而hello.txt 采用UTF-8 編碼格式,一個漢字占三字節(jié),一節(jié)流的讀入方式將一個漢字拆分為三字字節(jié),所以讀入內(nèi)容出現(xiàn)了亂碼


*/

public class Demo01 {
    public static void main(String[] args) throws IOException {
        // 1. 創(chuàng)建FileInputStream對象
        FileInputStream fis = new FileInputStream("D:\\hello.txt");


        // 2. 讀取
        int count=0;
        while ((count=fis.read())!=-1){
            System.out.print((char)count);
        }//?¥??¥??-|?1 ????¤??¤???‘??   亂碼
        // 3. 關(guān)閉
        fis.close();
    }
}



運行結(jié)果

?¥??¥??-|?1 ????¤??¤???‘??


2.22 使用文件字符流讀取文件代碼演示

package stream.demo02;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
//使用filereader讀取文件
public class FileReaderTest {
    public static void main(String[] args) throws IOException {
        // 1. 創(chuàng)建FileReader 文件字符輸入流
        FileReader frd = new FileReader("D:\\hello.txt");
        /*
        // 2. 讀取
        // 2.1 單個字符讀取
        int date=0;
        while ((date=frd.read())!=-1){//讀取一個字符
            System.out.print((char)date);
        }
       */

        //讀取多個字符

        char[] bytes = new char[5];// 字符緩沖區(qū)讀取
        int count=0;
        while ((count=frd.read(bytes))!=-1){
            System.out.println(new String(bytes,0,count));
        }
        // 3. 關(guān)閉
       frd.close();

    }
}




運行結(jié)果

好好學習,
天天向上

2.23 使用文件字符流寫入文件代碼演示

package stream.demo02;

import java.io.FileWriter;
import java.io.IOException;
//使用filewriter 寫入文件
public class FileWriteTest {
    public static void main(String[] args) throws IOException {
        // 1. 創(chuàng)建FileWriter對象
        FileWriter fileWriter = new FileWriter("D:\\write.txt");
        // 2. 寫入
        for (int i = 0; i < 10; i++) {
            fileWriter.write("要精通java\r\n");

            fileWriter.flush();

        }
        System.out.println("執(zhí)行完畢");
        // 3. 關(guān)閉
        fileWriter.close();

    }
}




運行結(jié)果

執(zhí)行完畢

截圖


2.24 利用字符流復制文件代碼演示

package stream.demo02;

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

/*

   使用字節(jié)流可以復制任意文件
   使用FileReader和FileWriter復制文本文件,不能復制圖片或二進制文件

   一切類型文件都是以二進制010101的形式存儲在硬盤上,字符流讀取文件時是按照編碼格式例如UTF-8 讀取,而圖片音頻等文件沒有編碼格式,因此字符流讀入亂碼

*/


public class FileCopyTest {
    public static void main(String[] args) throws IOException {
        // 1. 創(chuàng)建 FileReader   FileWriter
        FileReader frd = new FileReader("D:\\write.txt");
        FileWriter fwt = new FileWriter("D:\\write2.txt");

        // 2. 讀寫
        int count=0;
        while ((count=frd.read())!=-1){
            fwt.write(count);
            fwt.flush();

        }
        frd.close();
        fwt.close();
        System.out.println("執(zhí)行完畢");
    }
}



運行結(jié)果

執(zhí)行完畢

fuzhi

2.3 字符緩沖流

  • 緩沖流:BufferedReader / BufferedWriter
    • 高效讀寫
    • 支持輸入換行符
    • 可一次寫一行讀一行


2.31 字符緩沖輸入流代碼演示:

package stream.demo02;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
//使用字符緩沖流讀取文件
public class BufferReaderTest {
    public static void main(String[] args) throws IOException {
        // 創(chuàng)建緩沖流
        FileReader flr = new FileReader("D:\\write.txt");
        BufferedReader bufferedReader = new BufferedReader(flr);
        /*
        // 讀取
        // 1. 第一種方式

        char[] chars=new char[1024];
        int count=0;
        while ((count=bufferedReader.read(chars))!=-1){
            System.out.println(new String(chars,0,count));
        }
        */
        // 2. 第二種方式 一行一行讀取
        String st=null;
        while ((st=bufferedReader.readLine())!=null){//readLine():一行一行讀取文件,返回值為String類型當沒有下一行時返回null
            System.out.println(st);
        }
         // 關(guān)閉
        bufferedReader.close();
        System.out.println("執(zhí)行完畢");

    }

}


運行結(jié)果

要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
執(zhí)行完畢

2.32 字符緩沖輸出流代碼演示:

package stream.demo02;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
//使用字符緩沖流寫入文件
public class BufferWriterTest {
    public static void main(String[] args) throws IOException {
        // 1. 創(chuàng)建BufferedWriter對象
        FileWriter fileWriter = new FileWriter("D:\\buffer.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        // 2. 寫入
        for (int i = 0; i < 10; i++) {
            bufferedWriter.write("我愛學習,學習愛我");
            bufferedWriter.newLine(); // 寫入一個換行符  相當于windows \r\n  linux  \n
            bufferedWriter.flush();
        }
        // 3. 關(guān)閉
        bufferedWriter.close();// 此時會自動關(guān)閉fw
        System.out.println("執(zhí)行完畢");

    }
}


運行結(jié)果

執(zhí)行完畢

ddd


2.4 打印流

  • PrintWriter

    • 封裝了 print() / println()方法,支持寫入后換行
    • 支持數(shù)據(jù)原樣打印

2.41 打印流代碼演示:

package stream.demo02;

import java.io.FileNotFoundException;
import java.io.PrintWriter;

//功能:將數(shù)據(jù)打印到文件里    數(shù)據(jù)在代碼里什么樣子,打印出來就是什么樣子
public class PrintWriterTest {
    public static void main(String[] args) throws FileNotFoundException {
        // 1 創(chuàng)建打印流
        PrintWriter printWriter = new PrintWriter("D:\\print.txt");

        // 2 打印
        printWriter.println(65);
        printWriter.println(true);
        printWriter.println(3.1415);
        printWriter.print("A");
        // 3 關(guān)閉
        printWriter.close();
        System.out.println("打印完畢");

    }
}


運行結(jié)果

打印完畢


ttt


2.5 轉(zhuǎn)換流

  • 橋轉(zhuǎn)換流:InputStreamReader / OutputStreamWriter

    • 可將字節(jié)流轉(zhuǎn)換為字符流
    • 可設(shè)置字符的編碼方式

2.51 轉(zhuǎn)換流讀文件代碼演示:

package stream.demo03;

import java.io.*;

//使用inputStreamReader 讀取文件,指定使用的編碼  (和FileinputStream 最大區(qū)別就是可以指定編碼)
public class InputStreamReaderTest {
    public static void main(String[] args) throws IOException {
        // 1 創(chuàng)建InputStreamReader對象
        FileInputStream fis  = new FileInputStream("D:\\write.txt");
        InputStreamReader inputStreamReader = new InputStreamReader(fis,"utf-8");
        // 2 讀取文件
        int count=0;
        while ((count=inputStreamReader.read())!=-1){
            System.out.print((char)count);
        }
        // 3 關(guān)閉
        inputStreamReader.close();
        System.out.println("執(zhí)行完畢");


    }
}

運行結(jié)果

要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
要精通java
執(zhí)行完畢


2.52 轉(zhuǎn)換流寫文件代碼演示:

package stream.demo03;

import java.io.*;
//轉(zhuǎn)換流 使用OutputStreamWriter 寫文件  使用指定的編碼
public class OutputStreamWriterTest {
    public static void main(String[] args) throws IOException {
        // 1 創(chuàng)建OutputStreamReader對象
        FileOutputStream fos = new FileOutputStream("D:\\utf.txt");
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos,"utf-8");
        // 2 寫入
        for (int i = 0; i < 10; i++) {
            outputStreamWriter.write("我愛中國,熱愛祖國\n\r");// **\r:**回車,移動到當前行行首;
                                                      //**\n:**換行,換到當前位置的下一行,但是不會回到行首;
                                                      //**\r\n:**回車+換行,移動到下一行的行首
            outputStreamWriter.flush();

        }
        // 3 關(guān)閉
        outputStreamWriter.close();
        System.out.println("執(zhí)行完畢");

    }
}

運行結(jié)果

執(zhí)行完畢

uuu


3.File 類

  • 概念:代表物理盤符中的一個文件或者文件夾
    • IO 流: 對文件的內(nèi)容操作.

    • File 類: 對文件自身進行操作,eg:刪除文件,文件重新命名等.

3.1 常用方法

  • 目前常見的方法有:
    • createNewFile()// 創(chuàng)建一個新文件
    • mkdir() //創(chuàng)建文件夾
    • delete() // 刪除文件或空文件夾
    • exists() // 判斷 File 對象所代表的對象是否存在
    • getAbsolutePath() // 獲取文件的絕對路徑
    • getName() // 獲取名字
    • getParent() // 獲取 文件/目錄 所在的目錄
    • isDirectory() // 是否是目錄,而不是文件
    • isFile() 是否為文件,而不是目錄
    • length() // 獲取文件的長度
    • listFiles() // 列出目錄中所有內(nèi)容
    • renameTo() // 更改文件的名字

3.1 文件操作代碼演示:

package stream.demo04;

import java.io.File;
import java.io.IOException;
import java.util.Date;
/*
File類的使用
1. 分隔符
2. 文件操作
3. 文件夾操作
*/
//對文件進行操作
public class FileTest {
    public static void main(String[] args) throws Exception {
        sepearatorTest();
        fileOpTest();
    }
    // 1. 分隔符
    public static void sepearatorTest(){
        System.out.println("打印路徑分割符:"+File.pathSeparator);
        System.out.println("名稱分割符:"+File.separator);
    }
    // 2. 文件操作
    public static void fileOpTest() throws IOException, InterruptedException {
        // 1. 創(chuàng)建文件
        File file = new File("D:\\file.txt");
        if(!file.exists()){// 是否存在
        boolean newFile = file.createNewFile();
        System.out.println("創(chuàng)建結(jié)果:"+newFile);
        }
        // 2. 刪除文件兩個刪除方法
        // 2.1 直接刪除
        //System.out.println("刪除結(jié)果:"+file.delete());


        // 2.2 使用jvm退出時刪除
//        file.deleteOnExit();
//        Thread.sleep(5000);

        // 3. 獲取文件信息
        System.out.println("獲取文件絕對路徑"+file.getAbsolutePath());
        System.out.println("獲取文件相對路徑"+file.getPath());
        System.out.println("獲取文件名稱"+file.getName());
        System.out.println("獲取文件父目錄"+file.getParent());
        System.out.println("獲取文件的長度"+file.length());
        System.out.println("獲取文件的創(chuàng)建時間"+new Date(file.lastModified()).toLocaleString());

        // 4. 判斷
        System.out.println("是否是文件:"+file.isFile());
        System.out.println("是否可寫:"+file.canWrite());
        System.out.println("是否隱藏:"+file.isHidden());

    }



}


運行結(jié)果

打印路徑分割符:;
名稱分割符:\
獲取文件絕對路徑D:\file.txt
獲取文件相對路徑D:\file.txt
獲取文件名稱file.txt
獲取文件父目錄D:\
獲取文件的長度27
獲取文件的創(chuàng)建時間2022-7-7 16:31:48
是否是文件:true
是否可寫:true
是否隱藏:false


3.2 文件夾操作代碼演示:

package stream.demo04;

import java.io.File;
import java.io.FileFilter;
import java.util.Date;
//文件夾操作
public class DirOpeTest {
    public static void main(String[] args) throws InterruptedException {

        dirTest();

    }
    public static void dirTest() throws InterruptedException {
        // 1. 創(chuàng)建文件夾
        File dir = new File("D:\\aa\\bb\\cc");
        if(!dir.exists()){
            //dir.mkdir(); // 只能創(chuàng)建單級目錄
            System.out.println("創(chuàng)建文件夾結(jié)果"+dir.mkdirs());// 創(chuàng)建多級目錄
        }

        // 2. 刪除文件夾
        // 2.1 直接刪除
        //dir.delete();// 只能刪除最底層空目錄
        // 2.2 使用jvm刪除
       // dir.deleteOnExit();
        //Thread.sleep(5000);

        // 3. 獲取文件夾信息
        System.out.println("獲取文件夾絕對路徑:"+dir.getAbsolutePath());
        System.out.println("獲取文件夾路徑:"+dir.getPath());
        System.out.println("獲取父目錄:"+dir.getParent());
        System.out.println("獲取最后一次調(diào)整時間:"+new Date(dir.lastModified()).toLocaleString());
        System.out.println("獲取文件夾名稱:"+dir.getName());

        // 4. 判斷
        System.out.println("判斷文件夾是否存在:"+dir.exists());
        System.out.println("是否隱藏:"+dir.isHidden());

        // 5. 遍歷文件夾  使用list()
        File dir2 = new File("D:\\aa");
        String[] list = dir2.list();
        System.out.println("=======================");
        for (String s : list) {
            System.out.println(s);
        }

        System.out.println("------------FileFilter的使用-------------------");

        //使用listFiles() 遍歷文件夾
        File[] files = dir2.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if(pathname.getName().endsWith("jpg")){
                    return true;
                }
                return false;
            }
        });

        for (File file : files) {
            System.out.println(file.getName());
        }


    }

}

運行結(jié)果

獲取文件夾絕對路徑:D:\aa\bb\cc
獲取文件夾路徑:D:\aa\bb\cc
獲取父目錄:D:\aa\bb
獲取最后一次調(diào)整時間:2022-7-12 20:39:30
獲取文件夾名稱:cc
判斷文件夾是否存在:true
是否隱藏:false
=======================
13-1F113092322-50.jpg
13-1F1130Z915.jpg
bb
------------FileFilter的使用-------------------
13-1F113092322-50.jpg
13-1F1130Z915.jpg


3.3 文件夾遍歷操作代碼演示:

package stream.demo04;

import java.io.File;
//文件夾遍歷操作
public class ListdirDemo {
    public static void main(String[] args) {

        listDir(new File("D:\\aa"));
        deleteDir(new File("D:\\aa"));

    }
        //遞歸遍歷文件夾所有文件
    public static void listDir(File dir){

        File[] files = dir.listFiles();//獲取文件夾中所有文件

        System.out.println(dir.getAbsolutePath());

        if(files!=null&&files.length>0){
            for (File file : files) {//遍歷files 文件夾中所有內(nèi)容
                 if (file.isDirectory()){//若該內(nèi)容是一個文件夾,則遞歸調(diào)用listDIr()方法,進入該文件夾然后重復判斷文件夾是否還有文件夾
                     listDir(file);
                 }else {
                     System.out.println(file.getAbsolutePath()//直到遞歸內(nèi)容不是文件夾為止,打印當前文件內(nèi)容的絕對路徑
                     );

                 }

            }
        }

    }

    //遞歸 刪除文件夾及所有文件
    public static void deleteDir(File dir){
        File[] files = dir.listFiles();
        if(files!=null&&files.length>0){
            for (File file : files) {
                if (file.isDirectory()){//files中有子文件夾和文件,判斷當前內(nèi)容是否是文件,是文件遞歸調(diào)用方法,進入子文件夾
                    deleteDir(file);//遞歸
                }else {
                    //刪除文件
                    System.out.println(file.getAbsolutePath()+"刪除文件:"+file.delete());
                }
            }

        }
        System.out.println(dir.getAbsolutePath()+"刪除:"+dir.delete());//當該文件夾中內(nèi)容刪除完畢時,刪除文件夾
    }



}

運行結(jié)果

D:\aa
D:\aa\13-1F113092322-50.jpg
D:\aa\13-1F1130Z915.jpg
D:\aa\bb
D:\aa\bb\cc
D:\aa\bb\fjogan.jfif
D:\aa\bb\girl_cloth1.jpg
D:\aa\bb\girl_cloth2.jpg
D:\aa\bb\i1636011671_2947_0.jpg
D:\aa\bb\idCard1.png
D:\aa\bb\increment.meta
D:\aa\13-1F113092322-50.jpg刪除文件:true
D:\aa\13-1F1130Z915.jpg刪除文件:true
D:\aa\bb\cc刪除:true
D:\aa\bb\fjogan.jfif刪除文件:true
D:\aa\bb\girl_cloth1.jpg刪除文件:true
D:\aa\bb\girl_cloth2.jpg刪除文件:true
D:\aa\bb\i1636011671_2947_0.jpg刪除文件:true
D:\aa\bb\idCard1.png刪除文件:true
D:\aa\bb\increment.meta刪除文件:true
D:\aa\bb刪除:true
D:\aa刪除:true


————————————————————————————————————————————————————————————————————————————

更多參考

千峰教育-IO框架

原文鏈接:https://blog.csdn.net/qq_60501861/article/details/125751606

欄目分類
最近更新