新手小白看過(guò)來(lái)學(xué)JAVA必過(guò)IO流File字節(jié)流字符流
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)文章
淺談Storm在zookeeper上的目錄結(jié)構(gòu)
這篇文章主要介紹了淺談Storm在zookeeper上的目錄結(jié)構(gòu)的相關(guān)內(nèi)容,涉及storm使用zookeeper的操作以及詳細(xì)結(jié)構(gòu)圖,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10SpringBoot整合GRPC微服務(wù)遠(yuǎn)程通信的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot整合GRPC微服務(wù)遠(yuǎn)程通信的實(shí)現(xiàn)示例,包含gRPC的工作原理,以及如何在Spring Boot應(yīng)用中集成gRPC,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Java使用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 是一個(gè)基于 java 的持久層框架,它內(nèi)部封裝了 jdbc,極大提高了我們的開(kāi)發(fā)效率,文中給大家介紹了MybatisPlus常用API-增刪改查功能,感興趣的朋友跟隨小編一起看看吧2022-11-11Java中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-10Java如何通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法
這篇文章主要介紹了Java如何通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Spring Boot 啟動(dòng)注解過(guò)程分析
這篇文章主要為大家介紹了Spring Boot 啟動(dòng)注解過(guò)程示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06