第11篇-JAVA IO

2022-03-11 11:31 更新
  • 每篇一句 :不要在失敗時(shí)才想起別人的忠告,不要在失去之后才想起珍惜
  • 初學(xué)心得: 環(huán)境越艱難,越會(huì)出聰明人
  • (筆者:JEEP/711)[JAVA筆記 | 時(shí)間:2017-04-17| JAVA IO流 ]

1.流概念

流是指一連串流動(dòng)的字符,是以先進(jìn)先出方式發(fā)送信息的通道
即數(shù)據(jù)在兩設(shè)備間的傳輸稱為流,流的本質(zhì)是數(shù)據(jù)傳輸,根據(jù)數(shù)據(jù)傳輸特性將流抽象為各種類,方便更直觀的進(jìn)行數(shù)據(jù)操作

2.JAVA IO流

Java的IO流是實(shí)現(xiàn)輸入/輸出的基礎(chǔ),它可以方便地實(shí)現(xiàn)數(shù)據(jù)的輸入/輸出操作

Java中把不同的輸入/輸出源(鍵盤、文件、網(wǎng)絡(luò)連接等)抽象表述為“流”(stream),通過流的方式允許Java程序使用相同的方式來訪問不同的輸入/輸出源。stream是從起源(source)到接收(sink)的有序數(shù)據(jù)
Java把所有傳統(tǒng)的個(gè)流類型(類或抽象類)都放在java.io包中,用以實(shí)現(xiàn)輸入/輸出功能

3.JAVA IO流分類

按流向來分類:可以分為輸入流和輸出流:
- 輸入流:只能從中讀取數(shù)據(jù),而不能向其寫出數(shù)據(jù)
- 輸出流:只能向其寫出數(shù)據(jù),而不能從中讀取數(shù)據(jù)

字節(jié)流和字符流:
按照流的角色分,可以分為節(jié)點(diǎn)流和處理流

IO流的四個(gè)基類:
Java把所有設(shè)備里的有序數(shù)據(jù)抽象成流模型簡化了輸入/輸出的處理
Java的IO流共涉及到40多個(gè)類,這些類看上去蕪雜而凌亂,但實(shí)際上是非常規(guī)則、而且彼此之間存在非常緊密的聯(lián)系
Java的IO流的40多個(gè)類都是從4個(gè)抽象基類派生出來的:
- InputStream/Reader:所有輸入流的基類,前者是輸入字節(jié)流,后者是輸入字符。
- OutputStream/Writer:所有輸出流的基類,前者是輸出字節(jié)流,后者是輸出字符流

- 輸入流:InputStream和Reader是所有輸入流的基類,它們都是兩個(gè)抽象類,本身并不能創(chuàng)建實(shí)例來執(zhí)行輸入,但它們將所謂所有輸入流的模板,所以它們的方法是所有輸入流都可使用的方法
- int read():從輸入流中讀取單個(gè)字節(jié)(相當(dāng)于從圖15.5所示水管中取出一滴水),返回所讀取的字節(jié)數(shù)據(jù)(字節(jié)數(shù)據(jù)可直接轉(zhuǎn)換為int類型)
- int read(byte[]/char[] b):從輸入流中讀取最多b.length個(gè)字節(jié)的數(shù)據(jù),并將其存儲(chǔ)在字節(jié)數(shù)組b中,返回實(shí)際讀取的字節(jié)數(shù)
- int read(byte[]/char[] b, int off, int len):從輸入流中讀取最多l(xiāng)en字節(jié)的數(shù)據(jù),并將其存儲(chǔ)在數(shù)組 b 中,放入b數(shù)組中時(shí),并不是從數(shù)組起點(diǎn)開始,而是從off位置開始,返回實(shí)際讀取的字節(jié)數(shù)

- 輸出流:OutputStream和Writer也非常相似,它們采用模型來執(zhí)行輸出,兩個(gè)流都提供了如下三個(gè)方法
- void write(int c):將指定的字節(jié)/字符輸出到輸出流中,其中c既可以代表字節(jié),也可以代表字符
- void write(byte[]/char[] buf):將字節(jié)數(shù)組/字符數(shù)組中的數(shù)據(jù)輸出到指定輸出流中
- void write(char[] cbuf, int off, int len):將字節(jié)數(shù)組/字符數(shù)組中從off位置開始,長度為len的字節(jié)/字符輸出到輸出流中

處理流的用法:
- 使用處理流來包裝節(jié)點(diǎn)流,程序通過處理流來執(zhí)行輸入/輸出功能,讓節(jié)點(diǎn)流與底層的I/O設(shè)備、文件交互
- 程序使用處理流非常簡單,通常只需要在創(chuàng)建處理流時(shí)傳入一個(gè)節(jié)點(diǎn)流作為構(gòu)造器參數(shù)即可,這樣創(chuàng)建的處理流就是包裝了該節(jié)點(diǎn)流的處理流

4.流的操作規(guī)律

  • 1、明確源和目的。
    數(shù)據(jù)源:就是需要讀取,可以使用兩個(gè)體系:InputStream、Reader;
    數(shù)據(jù)匯:就是需要寫入,可以使用兩個(gè)體系:OutputStream、Writer;
    - 2、操作的數(shù)據(jù)是否是純文本數(shù)據(jù)?
    如果是:數(shù)據(jù)源:Reader
    數(shù)據(jù)匯:Writer
    如果不是:數(shù)據(jù)源:InputStream
    數(shù)據(jù)匯:OutputStream
    - 3、雖然確定了一個(gè)體系,但是該體系中有太多的對象,到底用哪個(gè)呢?
    明確操作的數(shù)據(jù)設(shè)備。
    數(shù)據(jù)源對應(yīng)的設(shè)備:硬盤(File),內(nèi)存(數(shù)組),鍵盤(System.in)
    數(shù)據(jù)匯對應(yīng)的設(shè)備:硬盤(File),內(nèi)存(數(shù)組),控制臺(tái)(System.out)
    - 4、需要在基本操作上附加其他功能嗎?比如緩沖,如果需要就進(jìn)行裝飾

5.java.io包

文本文件的讀寫:
- 用FileInputStream讀文件
- 用FileOutputStream寫文件
- 用BufferedReader讀文本文件
- 用BufferedWriter寫文本文件

二進(jìn)制文件的讀寫:
- DataOutputStream
- DataInputStream

6.字節(jié)流文件拷貝


<br> public class IoTest {
<br>    public static void main(String[] args) throws IOException,InterruptedException {
<br>        String path = "c:\\b.txt";
<br>        readFile(path);
<br>    }
<br>    private static void readFile(String path) {
<br>        FileInputStream fis = null;
<br>        try {
<br>            fis = new FileInputStream(path);
<br>            byte[] byt = new byte[1024];
<br>            int len = fis.read(byt);
<br>            System.out.println(new String(byt, 0, len));
<br>        } catch (IOException e) {
<br>            // 拋出運(yùn)行時(shí)異常
<br>            throw new RuntimeException(e);
<br>        } finally {
<br>            // 把close方法放入finally中保證一定會(huì)執(zhí)行
<br>            // 先判斷是否空指針
<br>            if (fis != null) {
<br>                try {
<br>                    fis.close();
<br>                } catch (Exception e) {
<br>                    throw new RuntimeException(e);
<br>                }
<br>            }
<br>        }
<br>    }
<br> }
<br> ```
<br>```
<br> public static void copyFile(String srcPath, String destPath) {
<br>        FileInputStream fis = null;
<br>        FileOutputStream fos = null;
<br>        try {
<br>            fis = new FileInputStream(srcPath);
<br>            fos = new FileOutputStream(destPath);
<br>            byte[] byt = new byte[1024 * 1024];
<br>            int len = 0;
<br>            while ((len = fis.read(byt)) != -1) {
<br>                fos.write(byt, 0, len);
<br>            }
<br>        } catch (IOException e) {
<br>            throw new RuntimeException(e);
<br>        } finally {
<br>            try {
<br>                if (fis != null) {
<br>                    fis.close();
<br>                }
<br>            } catch (IOException e) {
<br>                throw new RuntimeException(e);
<br>            } finally {
<br>                if (fos != null) {
<br>                    try {
<br>                        fos.close();
<br>                    } catch (IOException e) {
<br>                        throw new RuntimeException(e);
<br>                    }
<br>                }
<br>            }
<br>        }
<br>    }
<br>```

7.字符流文件拷貝


<br> public static void main(String[] args) throws Exception {
<br>        String path1 = "c:/a.txt";
<br>        String path2 = "c:/b.txt";
<br>        copyFile2(path1, path2);
<br>    }
<br> /**
<br>     * 使用字符流拷貝文件,有完善的異常處理
<br>     */
<br> public static void copyFile2(String path1, String path2) {
<br>        Reader reader = null;
<br>        Writer writer = null;
<br>        try {
<br>            // 打開流
<br>            reader = new FileReader(path1);
<br>            writer = new FileWriter(path2);
<br>            // 進(jìn)行拷貝
<br>            int ch = -1;
<br>            while ((ch = reader.read()) != -1) {
<br>                writer.write(ch);
<br>            }
<br>        } catch (Exception e) {
<br>            throw new RuntimeException(e);
<br>        } finally {
<br>            // 關(guān)閉流,注意一定要能執(zhí)行到close()方法,所以都要放到finally代碼塊中
<br>            try {
<br>                if (reader != null) {
<br>                    reader.close();
<br>                }
<br>            } catch (Exception e) {
<br>                throw new RuntimeException(e);
<br>            } finally {
<br>                try {
<br>                    if (writer != null) {
<br>                        writer.close();
<br>                    }
<br>                } catch (Exception e) {
<br>                    throw new RuntimeException(e);
<br>                }
<br>            }
<br>        }
<br>    }
<br> ```

初學(xué)(JAVA IO流 高級階段) 難點(diǎn): ★★★★★

希望每一篇文章都能夠?qū)ψx者們提供幫助與提升,這乃是每一位筆者的初衷

感謝您的閱讀 歡迎您的留言與建議

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)