文本咱們能讀懂的均可以認爲是字符流,文章 java文件都是字符流數據java
流的分類 輸入流 輸出流數組
1。輸出流 Writer:關於字符流的父類,抽象類。與之相對的輸入流 Reader類緩存
1、字符流eclipse
字符流的命名規則:若是是輸出流那麼就以Writer結尾,若是是輸入流就以Reader結尾性能
案例1:編碼
使用字符流向一個文件輸入Hello 沃得;spa
publicstaticvoid main(String[] args) {指針 File file =new File("test.txt");對象 System.out.println(file.length());排序 Writer writer = null; try { //I/O流是須要關閉的,若是不這樣作就不能關閉資源 writer = new FileWriter(file); writer.write("hellow"); } catch (IOException e) {
e.printStackTrace(); }finally { //判斷writer不是空 防止空指針異常 if(writer != null) { try { //writer.close的功能和flash同樣都是清除緩存 writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } |
主要考慮異常的處理,writer的聲明方法也須要仔細查看,根據寫入的數據類型決定選擇哪一個方法來寫入內容
文件的追加:
publicstaticvoid main(String[] args) { Filefile =new File("test.txt"); System.out.println(file.length()); Writer writer = null; try { //I/O流是須要關閉的,若是不這樣作就不能關閉資源 //後面的布爾值若是爲true則是在文件後面追加內容 writer = new FileWriter("text2.txt",true); for(inti = 0; i < 100; i++) { writer.write("halloword"); //每次寫夠10個哈嘍沃得就清除一下緩存 if(i % 10 == 0) { System.out.println("\n"); writer.flush(); } } } catch (IOException e) {
e.printStackTrace(); }finally { //判斷writer不是空 防止空指針異常 if(writer != null) { try { //writer.close的功能和flash同樣都是清除緩存 writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } |
字符輸出流的換行:
在寫入的內容中的換行符\n前加上\r才能實現換行
try { //I/O流是須要關閉的,若是不這樣作就不能關閉資源 //後面的布爾值若是爲true則是在文件後面追加內容 writer = new FileWriter("text2.txt",true); for(inti = 0; i < 100; i++) { writer.write("halloword\r\n"); //每次寫夠10個哈嘍沃得就清除一下緩存 if(i % 10 == 0) { System.out.println(""); writer.flush(); } } } catch (IOException e) {
e.printStackTrace(); } writer的寫入方法: writer = new FileWriter("text3.txt",true); char[] c = {'a','b','c','d','e','f','g'}; writer.write(c, 2, 3); |
字符的輸入流:
publicstaticvoid main(String[] args) { File file =new File("test.txt"); Readerreader =null; try { reader = new FileReader(file); //單個字符的讀取,讀取的字符被轉換爲ASCII碼 /* * 經過char能夠將得到的ASCII強轉爲char的字符型, * read()方法在讀取到最後的時候值會變成-1,因此能夠用while * 循環遍歷文本中的內容,這種單個字符的讀取性能不高。通常不用 */ intc; try { while((c = reader.read()) != -1) { System.out.print((char)c+"\r\n"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(reader != null) { try { reader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } |
字符輸入流2:用數組讀取內容
publicstaticvoid main(String[] args) { File file =new File("test.txt"); Reader reader = null; try { reader = new FileReader(file); //定義一個數組,這個方法是較爲經常使用的方法 char[] arr = newchar[10]; //向字符數組填數據 try { intlen = 0; //intlen = reader.read(arr); //System.out.println("len的值"+len+"讀取的內容"+Arrays.toString(arr)); 輸出結果爲len的值10 讀取的內容...(arr數組內的10個元素) 若是數組中的元素不夠10個,則長度變爲文本內容長度, * 元素有多長替換多長的,空出來的數組下標位置,仍是爲之前的元素值 * 知道最後徹底沒有元素了,讀取長度變爲-1 * while循環得到文本中的全部內容,因爲最後一次讀取,不必定能讀取夠 * 定義的數組長度,因此在將其轉成字符串的使用用String(數組名,取值開始位置,取值結束位置) * 將結束位置設置爲從read()方法得到的長度。直到其返回爲-1,while結束循環。 */ while((len = reader.read(arr)) != -1) { String str = new String(arr,0,len); System.out.print(str); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { reader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
文件的拷貝
publicstaticvoid main(String[] args) { * 1.經過輸入流將文件讀取到字符串中; File file =new File("D:\\Users\\Administrator\\eclipse-workspace\\7.13\\src\\ExtendOne.java"); Reader reader = null; File file1 = new File("javaCopy.java"); Writer writer = null; try { intlen; //建立字符輸入流的對象 reader = new FileReader(file); try { //建立字符輸出流的對象 writer =new FileWriter(file1); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } char[] arr = newchar[10]; try { while((len = reader.read(arr)) != -1){ //把輸入流讀取到的數據寫入字符輸出流,輸出流被寫入玩後須要writer.flush()清除緩存; writer.write(arr, 0, len); } writer.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //須要將打開的輸入輸出流關閉 //原則爲:先打開的後關閉,後打開的先關閉.都須要異常處理 //兩個異常處理能夠合一塊,在同一個try內判斷是否爲空並關閉對象便可。 if(writer != null) { try { writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(reader != null) { try { reader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } |
字節流的高效緩衝字節流
publicstaticvoid main(String[] args) { //定義一個高效緩衝字節流,能夠複製圖片 BufferedInputStream in =null; BufferedOutputStream out = null; try { //建立一個高效緩衝字節流對象 //和輸入輸出流同樣都是須要關閉的,先開的後關,後開的先關 in =new BufferedInputStream(new FileInputStream("E:\\Program Files\\冒泡排序.jpg")); out = new BufferedOutputStream(new FileOutputStream("maopao.jpg")); //定義一個字節數組 byte[] bs = newbyte[1024]; //定義一個標誌 intlen; try { while((len = in.read(bs)) != -1) { out.write(bs,0,len); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(out != null) { try { out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(in != null) { try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
} |
字符流操做文本,字節流操做二進制,字節是最小的基本單位,一個字符佔兩個字節。
OutputStreamWriter:是字符流轉換爲字節流的橋樑,可以使用指定的charset將要寫入流中的字符編碼成字節。
編碼:不一樣的編碼格式獲得的值不一樣!utf-8表和GBK表,能夠經過右鍵工程選擇Propertise菜單進入編碼格式編輯菜單。設置的編碼格式若是和寫入時保存的文件格式不一樣則會產生亂碼,所以須要進行編碼設置。字符流通向字節流的橋樑能夠指定存儲編碼