Java基礎-IO流對象之字節流(Stream)
java
做者:尹正傑golang
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。shell
在前面我分享的筆記中,咱們一直都是在操做文件或者文件夾,並無給文件中寫任何數據。如今咱們就要開始給文件中寫數據,或者讀取文件中的數據。什麼是輸入呢?咱們這裏的輸入指的是將文件的內容加載到程序中的過程叫作輸入,那上面叫作輸出呢?就是將程序的內容持久化到硬盤上叫作輸出。數組
一.字節輸出流(outputStream)eclipse
java.io.OutputStream此抽象類是表示輸出字節流的全部類的超類。spa
做用:從Java程序將內存中的數據寫入到磁盤文件中。code
1>.字節輸出流FileOutputStream寫字節對象
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.FileOutputStream; 10 import java.io.IOException; 11 12 public class FileOutputStreamDemo { 13 public static void main(String[] args) throws IOException { 14 //流對象的構造方法,能夠根據路徑建立文件,若是文件存在則直接清空文件內容! 15 FileOutputStream fos = new FileOutputStream("yinzhengjie.txt"); 16 //往文件中寫一個字節 17 fos.write(50); 18 fos.write(48); 19 fos.write(49); 20 fos.write(56); 21 //釋放資源 22 fos.close(); 23 } 24 }
2>.字節輸出流FileOutputStream寫字節數組blog
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.FileOutputStream; 10 import java.io.IOException; 11 12 public class FileOutputStreamDemo { 13 public static void main(String[] args) throws IOException { 14 //流對象的構造方法,能夠根據路徑建立文件,若是文件存在則直接清空文件內容! 15 FileOutputStream fos = new FileOutputStream("yinzhengjie.txt"); 16 //寫一個字節數組 17 byte[] bytes = {65,66,67,68,69,70}; 18 fos.write(bytes); 19 //釋放資源 20 fos.close(); 21 } 22 }
3>.字節輸出流FileOutputStream寫字節數組的一部分索引
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.FileOutputStream; 10 import java.io.IOException; 11 12 public class FileOutputStreamDemo { 13 public static void main(String[] args) throws IOException { 14 //流對象的構造方法,能夠根據路徑建立文件,若是文件存在則直接清空文件內容! 15 FileOutputStream fos = new FileOutputStream("yinzhengjie.txt"); 16 byte[] bytes = {65,66,67,68,69,70}; 17 //寫一個字節數組的一部分,須要傳入數組對象,數組的開始索引,從開始索引開始計算須要寫入的長度 18 fos.write(bytes,0,3); 19 //釋放資源 20 fos.close(); 21 } 22 }
4>.寫入字節數組的簡便方式(寫入字符串)
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.FileOutputStream; 10 import java.io.IOException; 11 12 public class FileOutputStreamDemo { 13 public static void main(String[] args) throws IOException { 14 //流對象的構造方法,能夠根據路徑建立文件,若是文件存在則直接清空文件內容! 15 FileOutputStream fos = new FileOutputStream("yinzhengjie.txt"); 16 //寫入字符串數組 17 fos.write("yinzhengjie".getBytes()); 18 fos.close(); 19 } 20 }
5>.以追加的方式寫入
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.File; 10 import java.io.FileOutputStream; 11 import java.io.IOException; 12 13 public class FileOutputStreamDemo { 14 public static void main(String[] args) throws IOException { 15 File file = new File("yinzhengjie.txt"); 16 //以追加的方式寫入數據,須要在FileOutputStream的構造方法中指定參數爲true. 17 FileOutputStream fos = new FileOutputStream(file,true); 18 //寫入換行符 19 fos.write("\r\n".getBytes()); 20 fos.write("yinzhengjie\r\n".getBytes()); 21 fos.close(); 22 } 23 }
二.IO中的異常處理
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.FileOutputStream; 10 import java.io.IOException; 11 12 public class FileOutputStreamDemo { 13 public static void main(String[] args) { 14 //try 外面聲明變量,try裏面創建對象,也就是將fos的做用域提示,這樣就能夠讓finally做用域能夠訪問到。 15 FileOutputStream fos = null; 16 17 try { 18 //注意,這裏給的盤符若是不存在的話就會建立失敗,此時fos的值就位null。 19 fos = new FileOutputStream("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\workspace\\Day8\\yinzhengjie.txt"); 20 fos.write("yinzhengjie".getBytes()); 21 22 } catch (IOException e) { 23 //若是硬件問題應該讓用戶重試,好比用戶在寫入數據的時候拔掉U盤。 24 System.out.println(e.getMessage()); 25 throw new RuntimeException("文件寫入失敗,請重試!"); 26 }finally { 27 try { 28 //在釋放資源的時候須要對流對象進行判斷是否爲null,若是不是null。表示對象創建成功,須要關閉資源。 29 if(fos!=null) { 30 fos.close(); 31 } 32 } catch (IOException e) { 33 throw new RuntimeException("關閉資源失敗!"); 34 } 35 } 36 } 37 }
三.字節輸入流InputStream
java.io.InputStream此抽象類是表示輸出字節流的全部類的超類。
做用:將磁盤文件文件內容加載到內存中來。
1>.按照一個字節進行讀取
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.File; 10 import java.io.FileInputStream; 11 import java.io.FileNotFoundException; 12 import java.io.IOException; 13 14 public class FileInputStreamDemo { 15 public static void main(String[] args) throws IOException { 16 File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\workspace\\Day8\\yinzhengjie.txt"); 17 FileInputStream fis = new FileInputStream(file); 18 int index = 0; 19 //依次讀取一個字節,當讀到文件末尾時index的值爲-1,所以稱爲結束循環的條件。 20 while((index = fis.read()) != -1) { 21 System.out.print((char)index); 22 } 23 fis.close(); 24 } 25 } 26 27 /* 28 以上代碼執行結果以下: 29 yinzhengjie 30 Java 31 2018 32 Bg Date 33 golang 34 Python 35 Linux 36 shell 37 */
2>.按照一個字節數組進行讀取數據
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.File; 10 import java.io.FileInputStream; 11 import java.io.FileNotFoundException; 12 import java.io.IOException; 13 14 public class FileInputStreamDemo { 15 public static void main(String[] args) throws IOException { 16 File file = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\workspace\\Day8\\yinzhengjie.txt"); 17 FileInputStream fis = new FileInputStream(file); 18 //建立字節數組 19 byte[] buf = new byte[4096]; 20 int index ; 21 //依次讀取一個字節,當讀到文件末尾時index的值爲-1,所以稱爲結束循環的條件。 22 while((index = fis.read(buf)) != -1) { 23 //調用字符串的構造方法,將讀取的數據轉換成字符串 24 System.out.print(new String(buf,0,index)); 25 } 26 fis.close(); 27 } 28 } 29 30 /* 31 以上代碼執行結果以下: 32 yinzhengjie 33 Java 34 2018 35 Bg Date 36 golang 37 Python 38 Linux 39 shell 40 */
四.小試牛刀
1>.字節流複製文件讀取單個字節
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.File; 10 import java.io.FileInputStream; 11 import java.io.FileOutputStream; 12 import java.io.IOException; 13 14 public class FileCopyDemo { 15 public static void main(String[] args) throws IOException { 16 17 18 FileInputStream fis = null; 19 FileOutputStream fos = null; 20 21 try { 22 File src = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\workspace\\Day8\\yinzhengjie.txt"); 23 File dest = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\workspace\\Day8\\yinzhengjie.backup"); 24 //創建兩個流的對象,綁定源文件和目標文件 25 fis = new FileInputStream(src); 26 fos = new FileOutputStream(dest); 27 //字節輸入流,讀取一個字節,輸出流寫一個字節 28 int index ; 29 while((index = fis.read()) != -1) { 30 fos.write(index); 31 } 32 }catch(IOException e) { 33 System.out.println(e.getMessage()); 34 throw new RuntimeException("文件複製失敗"); 35 }finally { 36 try { 37 if(fos != null) { 38 fos.close(); 39 } 40 }catch(IOException e) { 41 throw new RuntimeException("是否資源失敗"); 42 }finally { 43 try { 44 if(fis != null ) { 45 fis.close(); 46 } 47 }catch(IOException e) { 48 throw new RuntimeException("釋放資源失敗"); 49 } 50 } 51 } 52 } 53 }
2>.字節流複製文件讀取字節數組
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.File; 10 import java.io.FileInputStream; 11 import java.io.FileOutputStream; 12 import java.io.IOException; 13 14 public class FileCopyDemo { 15 public static void main(String[] args) throws IOException { 16 FileInputStream fis = null; 17 FileOutputStream fos = null; 18 19 try { 20 File src = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\workspace\\Day8\\yinzhengjie.txt"); 21 File dest = new File("D:\\10.Java\\JavaSE\\eclipse\\Myprogram\\workspace\\Day8\\yinzhengjie.backup2"); 22 //創建兩個流的對象,綁定源文件和目標文件 23 fis = new FileInputStream(src); 24 fos = new FileOutputStream(dest); 25 //定義字節數組,緩衝數據 26 byte[] buf = new byte[4096]; 27 //讀取數組,寫入數組 28 int index; 29 while((index = fis.read(buf)) != -1) { 30 fos.write(buf,0,index); 31 } 32 }catch(IOException e) { 33 System.out.println(e.getMessage()); 34 throw new RuntimeException("文件複製失敗"); 35 }finally { 36 try { 37 if(fos != null) { 38 fos.close(); 39 } 40 }catch(IOException e) { 41 throw new RuntimeException("是否資源失敗"); 42 }finally { 43 try { 44 if(fis != null ) { 45 fis.close(); 46 } 47 }catch(IOException e) { 48 throw new RuntimeException("釋放資源失敗"); 49 } 50 } 51 } 52 } 53 }