字符流(cha[]數組)html
實例化File類的對象,指明要操做的文件java
注意:數組
在@Test測試中的相對路徑是相對於當前Module函數
在main函數的相對路徑是相對於當前工程測試
提供具體的流指針
數據的讀入過程code
流的關閉操做視頻
try-catch-finally異常處理htm
@org.junit.Test public void test1(){ FileReader fileReader = null; try { //1. 實例化File類的對象,指明要操做的文件 //注意:在@Test測試中的相對路徑是相對於當前Module,在main函數的相對路徑是相對於當前工程 File file = new File("hello.txt");//相對路徑 //2. 提供具體的流 fileReader = new FileReader(file); //3. 數據的讀入過程 //read():返回讀入的一個字符。若是達到文件末尾,返回-1 //方式一 // int data = fileReader.read(); // while(data != -1){ // System.out.print((char)data); // data = fileReader.read(); // } //方式二:語法上針對方式一的修改 int data; while((data = fileReader.read()) != -1){ System.out.println((char)data); } } catch (IOException e) { e.printStackTrace(); }finally { //4. 流的關閉操做 try { //防止最開始提供流是出現異常致使這裏是空指針,因此加一個判斷 if(fileReader != null){ fileReader.close(); } } catch (IOException e) { e.printStackTrace(); } } }
此時的"hello.txt"文檔中存儲的內容是hello對象
建立一個char的數組cbuf
(舉例假定該數組的長度爲5)
char[] cbuf = new char[5];
建立len變量,存儲read(char[] cbuf)的返回值
(注意:返回值即爲每次讀入cbuf數組中的字符的個數)
讀取數據
for (int i = 0; i < len; i++) { System.out.print(cbuf[i]); }
String str = new String(cbuf,0,len); System.out.print(str);
流的關閉操做(不要忘記)
寫法一
for (int i = 0; i < len; i++) { System.out.print(cbuf[i]); }
其中for循環時,i必定要小於len(每次讀入cbuf數組中的字符的個數)而不是cbuf.length
畫圖說明:
最後還剩下3個數據的時候:
若是for循環中的i小於cbuf.length(錯誤的寫法)
最後的輸出爲:helloWorld123ld
(其中hello爲第一次的結果,World爲第二次的結果,123ld爲第三次的結果)
而文件中的內容爲helloWorld123,因此此時的寫法是錯誤的
若是for循環中的i小於len(正確的寫法)
最後的輸出爲:helloWorld123
(其中hello爲第一次的結果,World爲第二次的結果,123爲第三次的結果)
寫法二
String str = new String(cbuf,0,len); System.out.print(str);
其中利用了String(char[] value, int offset, int count)構造器,而不是String(char[] value)構造器
String(char[] value)構造器(錯誤的寫法)
錯誤緣由與寫法一錯誤的方法相同
String(char[] value, int offset, int count)構造器(正確的寫法)
讀取char[]數組中角標0到角標len的內容,過程與寫法一正確的方法過程相似
寫出操做,對應的File能夠不存在。
對原有文件的覆蓋
流使用的構造器爲
FileWriter(file, false)
或者是
FileWriter(file)
在原有文件的基礎上追加內容(不會對原有文件進行覆蓋)
流使用的構造器爲
FileWriter(file, true)
FileWriter fw1 = null; FileWriter fw2 = null; try { //1. 提供File類的對象,指明寫出到的文件 File file = new File("hi.txt"); //2. 提供FileWriter的對象,用於文件的寫出 //覆蓋 fw1 = new FileWriter(file,false); //不覆蓋 fw2 = new FileWriter(file,true); //3. 寫出的操做 fw1.write("I have a dream!\n"); fw2.write("123\n"); } catch (IOException e) { e.printStackTrace(); }finally { //4. 關閉流資源 if(fw1 != null) try { fw1.close(); } catch (IOException e) { e.printStackTrace(); }finally { if(fw2 != null) try { fw2.close(); } catch (IOException e) { e.printStackTrace(); } } }
最開始hi.txt文件中的內容爲hello
運行代碼後
在讀取文件文件時,選擇read(char[] cbuf)的用法
在寫入文件的時候,注意不要寫成
fw.write(cbuf);
此時出現的錯誤和讀取操做時寫法一會出現的錯誤相同,不能夠正確的讀取文件中本來的內容
須要使用
fw.write(cbuf,0,len);
讀取cbuf數組中角標爲0的元素到角標爲len的元素
在最後關閉流資源的時候,必定要注意兩個流都要關閉,即便其中一個流在關閉的時候拋出異常另外一個流也要關閉
有兩種寫法
finally { //4. 關閉流資源 if(fr != null) try { fr.close(); } catch (IOException e) { e.printStackTrace(); }finally { if(fw != null) try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } }
finally { //4. 關閉流資源 try { if(fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } try { if(fw != null) fw.close(); } catch (IOException e) { e.printStackTrace(); } }
public void test4(){ FileReader fr = null; FileWriter fw = null; try { //1. 建立File類的對象,指明讀入和寫出的文件 File file1 = new File("hello.txt"); File file2 = new File("hi.txt"); //2. 建立輸入流和輸出流的對象 fr = new FileReader(file1); fw = new FileWriter(file2,true); //3. 數據的讀入和寫入操做 char[] cbuf = new char[5]; int len;//記錄每次讀入到cbuf數組中字符的個數 while((len = fr.read(cbuf)) != -1){ //每次寫出len個字符 fw.write(cbuf,0,len); } } catch (IOException e) { e.printStackTrace(); }finally { //4. 關閉流資源 try { if(fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } try { if(fw != null) fw.close(); } catch (IOException e) { e.printStackTrace(); } } }
字符流不能處理圖片文件等字節數據!!!
字節流(byte[])
FileInputStream fis = null; FileOutputStream fos = null; try { File srcfile = new File("殷志源.png"); File destfile = new File("丸子.png"); fis = new FileInputStream(srcfile); fos = new FileOutputStream(destfile); byte[] buffer = new byte[5]; int len; while((len = fis.read(buffer)) != -1){ fos.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } try { if(fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } }
複製視頻
public void copyFile(String srcPath, String destPath){ FileInputStream fis = null; FileOutputStream fos = null; try { File srcfile = new File(srcPath); File destfile = new File(destPath); fis = new FileInputStream(srcfile); fos = new FileOutputStream(destfile); byte[] buffer = new byte[1024]; int len; while((len = fis.read(buffer)) != -1){ fos.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } try { if(fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } }