W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
流是指一連串流動(dòng)的字符,是以先進(jìn)先出方式發(fā)送信息的通道
即數(shù)據(jù)在兩設(shè)備間的傳輸稱為流,流的本質(zhì)是數(shù)據(jù)傳輸,根據(jù)數(shù)據(jù)傳輸特性將流抽象為各種類,方便更直觀的進(jìn)行數(shù)據(jù)操作
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)輸入/輸出功能
按流向來分類:可以分為輸入流和輸出流:
- 輸入流:只能從中讀取數(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)流的處理流
- 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)行裝飾
文本文件的讀寫:
- 用FileInputStream讀文件
- 用FileOutputStream寫文件
- 用BufferedReader讀文本文件
- 用BufferedWriter寫文本文件
二進(jìn)制文件的讀寫:
- DataOutputStream
- DataInputStream
<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>```
<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> ```
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: