欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

新手小白看過(guò)來(lái)學(xué)JAVA必過(guò)IO流File字節(jié)流字符流

 更新時(shí)間:2021年08月18日 15:01:04   作者:程序媛泡泡  
這篇文章主要介紹了新手小白學(xué)JAVA到IO流File字節(jié)流字符流的重點(diǎn),對(duì)流不清楚的新手同學(xué)快進(jìn)來(lái)學(xué)習(xí)吧,大佬也可以進(jìn)來(lái)溫故一下

IO簡(jiǎn)介

1.流Stream

在學(xué)習(xí)IO流之前,我們首先需要學(xué)習(xí)的概念就是Stream流
為了方便理解,我們可以把數(shù)據(jù)的讀寫操作抽象成數(shù)據(jù)在"管道"中流動(dòng),但需注意:
1.流只能單方向流動(dòng)
2.輸入流用來(lái)讀取 → in
3.輸出流用來(lái)寫出 → out
4.數(shù)據(jù)只能從頭到尾順序的讀寫一次
所以以程序的角度來(lái)思考,In/out 相對(duì)于程序而言的輸入(讀取)/輸出(寫出)的過(guò)程.

 

 2.IO流的繼承結(jié)構(gòu)

在java中,根據(jù)處理的數(shù)據(jù)單位不同,可以把流分為字節(jié)流和字符流
字節(jié)流 : 針對(duì)二進(jìn)制文件
字符流 : 針對(duì)文本文件,讀寫容易出現(xiàn)亂碼的現(xiàn)象,在讀寫時(shí),最好指定編碼集為UTF-8
在結(jié)合對(duì)應(yīng)類型的輸入和輸出方向,常用的流有:

File
字節(jié)流:針對(duì)二進(jìn)制文件
InputStream
FileInputStream
BufferedInputStream
ObjectInputStream
OutputStream
FileOutputStream
BufferedOutputStream
ObjectOutputStream
字符流:針對(duì)文本文件
Reader
FileReader
BufferedReader
InputStreamReader
Writer
FileWriter
BufferedWriter
OutputStreamWriter
PrintWriter一行行寫出

3 File文件類

3.1概述

封裝一個(gè)磁盤路徑字符串,對(duì)這個(gè)路徑可以執(zhí)行一次操作
可以封裝文件路徑、文件夾路徑、不存在的路徑

3.2創(chuàng)建對(duì)象

File(String pathname)通過(guò)將給定路徑名字符串轉(zhuǎn)換為抽象路徑名來(lái)創(chuàng)建一個(gè)新的File實(shí)例
new File(“d:/abc/a.txt”);
new File(“d:/abc”,”a.txt”);

3.3常用方法

 

 3.4 練習(xí):測(cè)試常用方法

創(chuàng)建包: cn.tedu.file
創(chuàng)建類: TestFile.java

package cn.tedu.file;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

/*本類用來(lái)測(cè)試文件類 File*/
public class TestFile {
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建File文件對(duì)象
        /*1.構(gòu)造函數(shù)的參數(shù)是String類型的pathname(路徑名)
        * 這個(gè)路徑可以是文件路徑,也可以是文件夾路徑*/
        /*2.\在代碼中有特殊的意義,所以想要真正表示這是一個(gè)\,需要用\進(jìn)行轉(zhuǎn)義*/
        //注意:此處需要自己手動(dòng)在D盤創(chuàng)建對(duì)應(yīng)目錄下的1.txt,并添加內(nèi)容
        //注意:創(chuàng)建1.txt時(shí),需要設(shè)置系統(tǒng)顯示文件后綴名,如果沒(méi)設(shè)置,文件名應(yīng)該是1
        //注意:File需要導(dǎo)包:import java.io.File;
        File file = new File("D:\\ready\\1.txt");

        //2.測(cè)試常用方法
        //2.1文件與文件夾屬性測(cè)試
        System.out.println(file.length());//12,獲取指定文件的字節(jié)量大小
        System.out.println(file.exists());//true,判斷指定文件是否存在
        System.out.println(file.isFile());//true,判斷指定內(nèi)容是否為文件
        System.out.println(file.isDirectory());//false,判斷指定內(nèi)容是否為文件夾
        System.out.println(file.getName());//1.txt,獲取指定內(nèi)容的名字
        System.out.println(file.getParent());//D:\ready,獲取指定內(nèi)容的上級(jí)
        System.out.println(file.getAbsolutePath());//D:\ready\1.txt,獲取指定內(nèi)容的絕對(duì)路徑

        //2.2創(chuàng)建與刪除
        file = new File("D:\\ready\\2.txt");
        /*如果指定創(chuàng)建文件的文件夾不存在,會(huì)報(bào)錯(cuò):java.io.IOException
        * 系統(tǒng)找不到指定的路徑,由于可能會(huì)發(fā)生異常,所以調(diào)用時(shí)需要拋出異常 */
        //在windows中創(chuàng)建不存在的文件2.txt,成功返回true
        System.out.println(file.createNewFile());//true

        file = new File("D:\\ready\\m");
        System.out.println(file.mkdir());//true,創(chuàng)建不存在的單層文件夾m
        file = new File("D:\\ready\\a\\b\\c");
        System.out.println(file.mkdirs());//true,創(chuàng)建不存在的多層文件夾a/b/c

        System.out.println(file.delete());//c被刪除,刪除文件或者空文件夾
        file  = new File("D:\\ready\\a");
        System.out.println(file.delete());//false,因?yàn)閍目錄里還有b目錄
        file  = new File("D:\\ready\\2.txt");
        System.out.println(file.delete());//true,刪除2.txt文件成功

        //2.3 文件列表測(cè)試
        file = new File("D:\\ready");
        String[] listName = file.list();
        System.out.println(Arrays.toString(listName));

        File[] fs = file.listFiles();
        System.out.println(Arrays.toString(fs));
        System.out.println(fs[0].length());

    }
}

4.字節(jié)流讀取

字節(jié)流是由字節(jié)組成的,字符流是由字符組成的.
Java里字符由兩個(gè)字節(jié)組成.字節(jié)流是基本流,主要用在處理二進(jìn)制數(shù)據(jù)。
所以字節(jié)流是比較常用的,可以可以處理多種不同種類的文件,比如文本文檔/音頻/視頻等等

4.1 InputStream抽象類

此抽象類是表示字節(jié)輸入流的所有類的超類/抽象類,不可創(chuàng)建對(duì)象哦

 常用方法:
abstract int read() 從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié)
int read(byte[] b) 從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組 b 中
int read(byte[] b, int off, int len) 將輸入流中最多 len 個(gè)數(shù)據(jù)字節(jié)讀入 byte 數(shù)組,off表示存時(shí)的偏移量
void close() 關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源

 4.2 FileInputStream子類

直接插在文件上,直接讀取文件數(shù)據(jù)

 創(chuàng)建對(duì)象
FileInputStream(File file)—直接傳文件對(duì)象
通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè) FileInputStream,該文件通過(guò)文件系統(tǒng)中的 File 對(duì)象 file 指定FileInputStream(String pathname)—傳路徑
通過(guò)打開(kāi)一個(gè)到實(shí)際文件的連接來(lái)創(chuàng)建一個(gè) FileInputStream,該文件通過(guò)文件系統(tǒng)中的路徑名 name 指定

 4.3 BufferedInputStream子類

BufferedInputStream 為另一個(gè)輸入流添加一些功能,在創(chuàng)建BufferedInputStream 時(shí),會(huì)創(chuàng)建一個(gè)內(nèi)部緩沖區(qū)數(shù)組(默認(rèn)8k大小)。在讀取或跳過(guò)流中的字節(jié)時(shí),可根據(jù)需要從包含的輸入流再次填充該內(nèi)部緩沖區(qū),一次填充多個(gè)字節(jié)。

創(chuàng)建對(duì)象
BufferedInputStream(InputStream in)
創(chuàng)建一個(gè) BufferedInputStream 并保存其參數(shù),即輸入流 in,以便將來(lái)使用。

4.4 練習(xí):字節(jié)流讀取案例

創(chuàng)建包: cn.tedu.file
創(chuàng)建類: TestIn.java

package cn.tedu.file;

import java.io.*;

/*本類用于練習(xí)字節(jié)輸入流*/
public class TestIn {
    public static void main(String[] args) {
        //method();//字節(jié)流的讀取
        method2();//高效字節(jié)流的讀取
    }

    //本方法用于測(cè)試高效字節(jié)流的讀取
    private static void method2() {
        //定義一個(gè)在本方法中都生效的局部變量in,注意手動(dòng)初始化,值為null
        InputStream in = null;
        try {
            //1.創(chuàng)建高效字節(jié)輸入流對(duì)象
//            InputStream in = new BufferedInputStream(
//                    new FileInputStream(new File("E:\\ready\\1.txt")));
              in = new BufferedInputStream
                      (new FileInputStream("E:\\ready\\1.txt"));
            //2.使用流進(jìn)行讀取
            int b;
            while ((b= in.read())!= -1){
                System.out.println(b);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {//關(guān)流操作寫在finally{}中
            //3.流用完以后一定要關(guān)閉?。?!
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

    //本方法用于測(cè)試字節(jié)流的讀取
    private static void method() {
        //創(chuàng)建一個(gè)在本方法都生效的局部變量注意手動(dòng)初始化
        InputStream in = null;
        try {
            //1.創(chuàng)建字節(jié)輸入流對(duì)象用于讀取
            //InputStream in = new InputStream();//報(bào)錯(cuò)原因:抽象類不可實(shí)例化
            //InputStream in = new FileInputStream(new File("E:\\ready\\1.txt"));
            in = new FileInputStream("E:\\ready\\1.txt");
            //2.開(kāi)始讀取
            /*read()每次調(diào)用都會(huì)讀取一個(gè)字節(jié),如果讀到了數(shù)據(jù)的末尾,返回-1*/
//            System.out.println(in.read());
//            System.out.println(in.read());
//            System.out.println(in.read());
//            System.out.println(in.read());
            //需求:需要循環(huán)讀取文件中的所有內(nèi)容,直至讀完
            //定義變量,記錄讀到的數(shù)據(jù)
            int b;
            while((b=in.read())!= -1){
                System.out.println(b);
            }
        } catch (Exception e) {
            e.printStackTrace();//打印錯(cuò)誤信息
        /*try-catch結(jié)構(gòu)中的第三個(gè)部分:finally{}
        * 這部分不論是否捕獲到異常,是一定會(huì)被執(zhí)行到的代碼,常用于關(guān)流*/
        }finally {
            try {
                //3.釋放資源,流資源用完必須釋放?。。?
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

5.字符流讀取

常用于處理純文本數(shù)據(jù)

5.1 Reader抽象類

用于讀取字符流的抽象類。

常用方法:
int read() 讀取單個(gè)字符
int read(char[] cbuf) 將字符讀入數(shù)組
abstract int read(char[] cbuf, int off, int len) 將字符讀入數(shù)組的某一部分
int read(CharBuffer target) 試圖將字符讀入指定的字符緩沖區(qū)
abstract void close() 關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源

5.2 FileReader子類

用來(lái)讀取字符文件的便捷類。此類的構(gòu)造方法假定默認(rèn)字符編碼和默認(rèn)字節(jié)緩沖區(qū)大小都是適當(dāng)?shù)?。要自己指定這些值,可以先在 FileInputStream 上構(gòu)造一個(gè) InputStreamReader。

創(chuàng)建對(duì)象
FileReader(String fileName) 在給定從中讀取數(shù)據(jù)的文件名的情況下創(chuàng)建一個(gè)新 FileReader
FileReader(File file) 在給定從中讀取數(shù)據(jù)的 File 的情況下創(chuàng)建一個(gè)新 FileReader

5.3 BufferedReader子類

從字符輸入流中讀取文本,緩沖各個(gè)字符,從而實(shí)現(xiàn)字符、數(shù)組和行的高效讀取。
可以指定緩沖區(qū)的大小,或者可使用默認(rèn)的大小。大多數(shù)情況下,默認(rèn)值就足夠大了。

創(chuàng)建對(duì)象
BufferedReader(Reader in) 創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流

5.4 練習(xí):字符流讀取案例

創(chuàng)建包: cn.tedu.file
創(chuàng)建類: TestIn2.java

package cn.tedu.file;

import java.io.*;

/*本類用于測(cè)試字符流的讀取*/
public class TestIn2 {
    public static void main(String[] args) {
        //method();//測(cè)試普通字符輸入流
        method2();//測(cè)試高效字符輸入流
    }
    //創(chuàng)建一個(gè)用于測(cè)試高效字符輸入流的方法
    private static void method2() {
        //1.定義一個(gè)在本方法都生效的局部變量,手動(dòng)初始化值null
        Reader in=null;
        try{
            //1.創(chuàng)建高效字符讀取流對(duì)象
            //in = new BufferedReader(new FileReader(new File("E:\\ready\\1.txt")));
            in = new BufferedReader(new FileReader("E:\\ready\\1.txt"));
            //2.使用流對(duì)象
            int b;
            while((b=in.read())!=-1){
                System.out.println(b);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //3.關(guān)閉流對(duì)象
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //創(chuàng)建一個(gè)用于測(cè)試普通字符輸入流的方法
    private static void method() {
        //1.1創(chuàng)建一個(gè)在本方法中都生效的局部變量,注意初始化值null
        Reader in = null;
        try {
            //1.2創(chuàng)建字符輸入流對(duì)象,注意需要捕獲異常
            //Reader in = new Reader();//報(bào)錯(cuò)原因:抽象父級(jí)不可實(shí)例化
            //in = new FileReader(new File("E:\\ready\\1.txt"));
            in = new FileReader("E:\\ready\\1.txt");
            //2.使用流對(duì)象
            //System.out.println(in.read());
            //需求:循環(huán)讀取文件中的所有內(nèi)容,只要不是-1,就說(shuō)明還有數(shù)據(jù),繼續(xù)讀取
            //3.1定義變量,記錄讀取到的數(shù)據(jù)
            int b;
            while((b = in.read())!= -1){
                System.out.println(b);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {//3.關(guān)流
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 6.字節(jié)流寫出

6.1 OutputStream抽象類

此抽象類是表示輸出字節(jié)流的所有類的超類.輸出流接受輸出字節(jié)并將這些字節(jié)發(fā)送到某個(gè)接收器.

常用方法:
Void close() 關(guān)閉此輸出流并釋放與此流相關(guān)的所有系統(tǒng)資源
Void flush() 刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字節(jié)
Void write(byte[ ] b) 將b.length個(gè)字節(jié)從指定的byte數(shù)組寫入此輸出流
Void write(byte[ ] b,int off ,int len) 將指定byte數(shù)組中從偏移量off開(kāi)始的len個(gè)字節(jié)寫入輸出流
Abstract void write(int b) 將指定的字節(jié)寫入此輸出流

6.2 FileOutputStream 子類

直接插在文件上,直接寫出文件數(shù)據(jù)

構(gòu)造方法(創(chuàng)建對(duì)象):
FileOutputStream(String name)
創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的文件輸出流
FileOutStream(File file)
創(chuàng)建一個(gè)向指定File對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流
FileOutStream(File file,boolean append)—如果第二個(gè)參數(shù)為true,表示追加,不覆蓋
創(chuàng)建一個(gè)向指定File對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流,后面的參數(shù)是指是否覆蓋原文件內(nèi)容

6.3 BufferedOutputstream 子類

該類實(shí)現(xiàn)緩沖的輸出流,通過(guò)設(shè)置這種輸出流,應(yīng)用程序就可以將各個(gè)字節(jié)寫入底層輸出流中,而不必每次針對(duì)字節(jié)寫出調(diào)用底層系統(tǒng)

構(gòu)造方法(創(chuàng)建對(duì)象):
BufferedOutputStream(OutputStream out)
創(chuàng)建一個(gè)新的緩沖輸出流,用以將數(shù)據(jù)寫入指定的底層輸出流

6.4 練習(xí): 字節(jié)輸出流測(cè)試:

創(chuàng)建包: cn.tedu.file
創(chuàng)建類: TestOut.java

package cn.tedu.file;

import java.io.*;

/*本類用于測(cè)試字節(jié)輸出流*/
public class TestOut {
    public static void main(String[] args) {
        method();//用于測(cè)試普通字節(jié)輸出流
        //method2();//用于測(cè)試高效字節(jié)輸出流
    }
    //創(chuàng)建一個(gè)用于測(cè)試高效字節(jié)輸出流的方法
    private static void method2() {
        //1.創(chuàng)建一個(gè)在本方法都生效的局部變量,注意手動(dòng)初始化
        OutputStream out = null;
        try{
            //2.創(chuàng)建高效字節(jié)輸出流對(duì)象
//          out = new BufferedOutputStream(new FileOutputStream(new File("E:\\ready\\2.txt")));
            out = new BufferedOutputStream(new FileOutputStream("E:\\ready\\2.txt"));
            //3.使用流對(duì)象--進(jìn)行寫出操作
            out.write(97);
            out.write(97);
            out.write(97);
        }catch (Exception e){
            e.printStackTrace();
        }finally {//關(guān)流操作要放在finally{}中
            try {
                //4.關(guān)流
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //創(chuàng)建一個(gè)用于測(cè)試普通字節(jié)輸出流的方法
    private static void method() {
        //1.創(chuàng)建一個(gè)在本方法中都生效的局部變量,注意手動(dòng)初始化null
        OutputStream out = null;
        //2.創(chuàng)建try-catch-finally結(jié)構(gòu),因?yàn)镮O操作可能會(huì)產(chǎn)生異常
        try{
            //3.創(chuàng)建普通字節(jié)輸出流對(duì)象
            //out = new FileOutputStream(new File("E:\\ready\\2.txt"));
            //out = new FileOutputStream("E:\\ready\\2.txt");
            out = new FileOutputStream("E:\\ready\\2.txt",true);
            //4.使用流對(duì)象--進(jìn)行寫出操作
            out.write(99);//對(duì)應(yīng)ASCII碼表中的a
            out.write(99);//對(duì)應(yīng)ASCII碼表中的b
            out.write(99);//對(duì)應(yīng)ASCII碼表中的c
        }catch (Exception e){
            e.printStackTrace();
        }finally {//如果想要代碼一定會(huì)執(zhí)行,需要寫在finally中
            try {
                //5.關(guān)流操作
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

7.字符流寫出

7.1 Writer 抽象類

寫入字符流的抽象類

常用方法:
Abstract void close() 關(guān)閉此流,但要先刷新它
Void write(char[ ] cbuf) 寫入字符數(shù)組
Void write(int c) 寫入單個(gè)字符
Void write(String str) 寫入字符串
Void write(String str,int off,int len) 寫入字符串的某一部分
Abstract void write(char[] cbuf,int off,int len)寫入字符數(shù)組的某一部分

7.2 FileWriter 子類

用來(lái)寫入字符文件的便捷類,此類的構(gòu)造方法假定默認(rèn)字符編碼和默認(rèn)字節(jié)緩沖區(qū)大小都是可接受的.如果需要自己自定義這些值,可以先在FileOutputStream上構(gòu)造一個(gè)OutputStreamWriter.

構(gòu)造方法(創(chuàng)建對(duì)象):
FileWriter(String filename)
根據(jù)給定的文件名構(gòu)造一個(gè)FileWriter對(duì)象
FileWriter(String filename,boolean append)
根據(jù)給定的文件名以及指示是否附加寫入數(shù)據(jù)的boolean值來(lái)構(gòu)造FileWriter

7.3 BufferedWriter子類

將文本寫入字符輸出流,緩沖各個(gè)字符,從而提供單個(gè)字符,數(shù)組和字符串的高效寫入.可以指定緩沖區(qū)的大小,或者接受默認(rèn)的大小,在大多數(shù)情況下,默認(rèn)值就足夠大了

構(gòu)造方法(創(chuàng)建對(duì)象):
BufferedWriter(Writer out)
創(chuàng)建一個(gè)使用默認(rèn)大小輸出緩沖區(qū)的緩沖字符輸出流

7.4 練習(xí): 字符輸出流測(cè)試:

創(chuàng)建包: cn.tedu.file
創(chuàng)建類: TestOut2.java

package cn.tedu.file;

import java.io.*;

/*本類用于測(cè)試字符輸出流*/
public class TestOut2 {
    public static void main(String[] args) {
        //method();//用于測(cè)試普通字符輸出流
        method2();//用于測(cè)試高效字符輸出流
    }
    //創(chuàng)建一個(gè)用于測(cè)試高效字符輸出流的方法
    private static void method2() {
        //1.創(chuàng)建一個(gè)在本方法都生效的局部變量,值為null,注意手動(dòng)初始化!?。?
        Writer out = null;
        //2.由于程序可能會(huì)拋出異常,所以需要寫一個(gè)try-catch-finally結(jié)構(gòu)
        try{//存放可能會(huì)拋出異常的代碼
            //3.創(chuàng)建普通字符輸出流對(duì)象
            //out = new BufferedWriter(new FileWriter(new File("E:\\ready\\2.txt")));
            //out = new BufferedWriter(new FileWriter("E:\\ready\\2.txt"));
            out = new BufferedWriter(new FileWriter("E:\\ready\\2.txt",true));
            //4.使用流對(duì)象
            out.write(100);
            out.write(100);
            out.write(100);
            out.write(100);
            out.write(100);
        }catch (Exception e){//匹配并捕獲異常
            e.printStackTrace();//如果捕獲到異常就打印錯(cuò)誤信息
        }finally {//一定會(huì)被執(zhí)行到的代碼塊,常用于關(guān)流
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //創(chuàng)建一個(gè)用于測(cè)試普通字符輸出流的方法
    private static void method() {
        //1.創(chuàng)建一個(gè)在本方法都生效的局部變量,值為null,注意手動(dòng)初始化?。?!
        Writer out = null;
        //2.由于程序可能會(huì)拋出異常,所以需要寫一個(gè)try-catch-finally結(jié)構(gòu)
        try{//存放可能會(huì)拋出異常的代碼
            //3.創(chuàng)建普通字符輸出流對(duì)象
            //out = new FileWriter(new File("E:\\ready\\2.txt"));
            //out = new FileWriter("E:\\ready\\2.txt");
            out = new FileWriter("E:\\ready\\2.txt",true);
            //4.使用流對(duì)象
            out.write(98);
            out.write(98);
            out.write(98);
            out.write(98);
        }catch (Exception e){//匹配并捕獲異常
            e.printStackTrace();//如果捕獲到異常就打印錯(cuò)誤信息
        }finally {//一定會(huì)被執(zhí)行到的代碼塊,常用于關(guān)流
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

8.拓展

通過(guò)學(xué)習(xí)以上的幾種流,我們也可以拓展嘗試做下文件的復(fù)制:
創(chuàng)建包: cn.tedu.file
創(chuàng)建類: TestCopyFile.java

package cn.tedu.file;

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

/*本類用于練習(xí)文件復(fù)制綜合案例*/
public class TestCopyFile {
    public static void main(String[] args) {
        //1.提示并接收用戶輸入的源文件路徑和目標(biāo)位置
        System.out.println("請(qǐng)您輸入源文件路徑:");
        String f = new Scanner(System.in).nextLine();
        System.out.println("請(qǐng)您輸入目標(biāo)位置:");
        String t = new Scanner(System.in).nextLine();
        //2.調(diào)用方法完成文件的復(fù)制
        //ZFCopy(f,t);//用字符流完成復(fù)制案例
        ZJCopy(f,t);//用字節(jié)流完成復(fù)制案例
    }
    private static void ZJCopy(String f,String t) {
        //1.定義在整個(gè)方法中都生效的局部變量,手動(dòng)初始化值為null
        InputStream in = null;
        OutputStream out = null;
        //2.由于代碼可能會(huì)發(fā)生異常,所以需要try-catch-finally結(jié)構(gòu)
        try{
            //3.1創(chuàng)建高效/緩沖字節(jié)輸入流,參數(shù)是f
            in = new BufferedInputStream(new FileInputStream(f));
            //3.2創(chuàng)建高效/緩沖字節(jié)輸出流,參數(shù)是t
            out = new BufferedOutputStream(new FileOutputStream(t));

            //4.創(chuàng)建好流對(duì)象以后就可以通過(guò)流對(duì)象完成業(yè)務(wù)了
            //4.1定義變量保存讀到的數(shù)據(jù)
            int b;
            //4.2使用循環(huán)完成復(fù)制操作
            while((b=in.read())!=-1){
                out.write(b);
            }
            System.out.println("恭喜您~文件復(fù)制成功~");
        }catch(Exception e){
            System.out.println("很抱歉~文件復(fù)制失敗~");
            e.printStackTrace();
        }finally {
            //5.關(guān)流
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    private static void ZFCopy(String f,String t) {
        //1.定義在整個(gè)方法中都生效的局部變量,手動(dòng)初始化值為null
        Reader in = null;
        Writer out = null;
        //2.由于代碼可能會(huì)發(fā)生異常,所以需要try-catch-finally結(jié)構(gòu)
        try{
            //3.1創(chuàng)建高效/緩沖字符輸入流,傳入的參數(shù)是源文件的路徑
            in = new BufferedReader(new FileReader(f));
            //3.2創(chuàng)建高效/緩沖字符輸出流,傳入的參數(shù)是目標(biāo)文件的路徑
            out = new BufferedWriter(new FileWriter(t));

            //4.拿到流對(duì)象以后,就可以使用流對(duì)象來(lái)完成業(yè)務(wù)了
            //4.1定義變量用來(lái)記錄讀到的數(shù)據(jù)
            int b;
            //4.2循環(huán)讀取目標(biāo)文件,直到返回值為-1,沒(méi)有數(shù)據(jù)時(shí)結(jié)束循環(huán)
            while((b=in.read())!=-1){
                out.write(b);/*將本次循環(huán)從源文件讀到的內(nèi)容寫出到目標(biāo)文件中*/
            }
            System.out.println("恭喜您!文件復(fù)制成功!");
        }catch (Exception e){
            System.out.println("很抱歉!文件復(fù)制失敗!");
            e.printStackTrace();
        }finally {
            /*關(guān)流是有順序的:如果有多個(gè)流,最后創(chuàng)建的流最先關(guān)閉
            * 多條關(guān)流語(yǔ)句需要各自try-catch*/
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

9.總結(jié):IO的繼承結(jié)構(gòu)

1.主流分類

1.按照方向進(jìn)行分類:輸入流 輸出流(相對(duì)于程序而言,從程序?qū)憯?shù)據(jù)到文件中是輸出)
2.按照傳輸類型進(jìn)行分類:字節(jié)流 字符流
3.組合: 字節(jié)輸入流 字節(jié)輸出流 字符輸入流 字符輸出流

2.學(xué)習(xí)方法:在抽象父類中學(xué)習(xí)通用的方法,在子類中學(xué)習(xí)如何創(chuàng)建對(duì)象

3.字節(jié)輸入流:

InputStream 抽象類,不能new,可以作為超類,學(xué)習(xí)其所提供的共性方法

--FileInputStream 子類,操作文件的字節(jié)輸入流,普通類
--BufferedInputStream 子類,緩沖字節(jié)輸入流,普通類

4.字符輸入流

Reader 抽象類,不能new,可以作為超類,學(xué)習(xí)其所提供的共性方法

--FileReader,子類,操作文件的字符輸入流,普通類
--BufferedReader,子類,緩沖字符輸入流,普通類

5.字節(jié)輸出流:

OutputStream 抽象類,不能new,可以作為超類,學(xué)習(xí)其所提供的共性方法

--FileOutputStream 子類,操作文件的字節(jié)輸出流,普通類
--BufferedOutputStream 子類,緩沖字節(jié)輸出流,普通類

6.字符輸出流

Writer 抽象類,不能new,可以作為超類,學(xué)習(xí)其所提供的共性方法

--FileWriter,子類,操作文件的字符輸出流,普通類
--BufferedWriter,子類,緩沖字符輸出流,普通類

到此這篇關(guān)于新手小白看過(guò)來(lái)學(xué)JAVA必過(guò)IO流File字節(jié)流字符流的文章就介紹到這了,更多相關(guān)Java的IO流File字節(jié)流字符流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Spring 聲明式事務(wù)詳解

    Java Spring 聲明式事務(wù)詳解

    這篇文章主要介紹了spring 聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 淺談Storm在zookeeper上的目錄結(jié)構(gòu)

    淺談Storm在zookeeper上的目錄結(jié)構(gòu)

    這篇文章主要介紹了淺談Storm在zookeeper上的目錄結(jié)構(gòu)的相關(guān)內(nèi)容,涉及storm使用zookeeper的操作以及詳細(xì)結(jié)構(gòu)圖,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot整合GRPC微服務(wù)遠(yuǎn)程通信的實(shí)現(xiàn)示例

    SpringBoot整合GRPC微服務(wù)遠(yuǎn)程通信的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot整合GRPC微服務(wù)遠(yuǎn)程通信的實(shí)現(xiàn)示例,包含gRPC的工作原理,以及如何在Spring Boot應(yīng)用中集成gRPC,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Java使用JDBC驅(qū)動(dòng)連接MySQL數(shù)據(jù)庫(kù)

    Java使用JDBC驅(qū)動(dòng)連接MySQL數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了Java使用JDBC驅(qū)動(dòng)連接MySQL數(shù)據(jù)庫(kù)的具體步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    MyBatis 是一個(gè)基于 java 的持久層框架,它內(nèi)部封裝了 jdbc,極大提高了我們的開(kāi)發(fā)效率,文中給大家介紹了MybatisPlus常用API-增刪改查功能,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Java中JDK動(dòng)態(tài)代理的超詳細(xì)講解

    Java中JDK動(dòng)態(tài)代理的超詳細(xì)講解

    JDK 的動(dòng)態(tài)代理是基于攔截器和反射來(lái)實(shí)現(xiàn)的,JDK代理是不需要第三方庫(kù)支持的,只需要JDK環(huán)境就可以進(jìn)行代理,下面這篇文章主要給大家介紹了關(guān)于Java中JDK動(dòng)態(tài)代理的超詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • java中DateUtils時(shí)間工具類詳解

    java中DateUtils時(shí)間工具類詳解

    這篇文章主要為大家詳細(xì)介紹了java中DateUtils時(shí)間工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Spring的AOP極簡(jiǎn)入門

    Spring的AOP極簡(jiǎn)入門

    今天小編就為大家分享一篇關(guān)于Spring的AOP極簡(jiǎn)入門,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java如何通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法

    Java如何通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法

    這篇文章主要介紹了Java如何通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring Boot 啟動(dòng)注解過(guò)程分析

    Spring Boot 啟動(dòng)注解過(guò)程分析

    這篇文章主要為大家介紹了Spring Boot 啟動(dòng)注解過(guò)程示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論