輸入輸出{
數據的輸入輸出時針對內存而言
外設----->內存:輸入流,進行讀的行爲
內存----->外設:輸出流,進行寫的行爲
}
字符流{
定義:字節流讀取文字字節數據後,不直接進行操作,而是先查詢指定的編碼表獲取對應文字,再對這個文字進行操作
即:字符流 = 字節流 + 編碼表
對象類:Reader Writer
FileWriter{
用法:創建一個文件流輸出對象,構造方法要明確數據路徑以及文件名
注意:如果該文件存在則覆蓋,如果不存在,則進行創建
常用方法{
void write(“ ”) 接收字符串數據寫入緩衝區中
void flush( ) 進行刷新,將緩衝區數據寫入目的地中
void close( ) 關閉該文件流,在關閉之前會自動調用一次刷新方法。如果關閉流之後對該再進行操作就會拋出異常
}
FileReader{
用法:創建一個文件流輸入對象,要明確被讀取的文件目標
常用方法{
int read( ) 從文件讀取一個字符,並返回該字符的ASCII
int read(數組引用) 將讀到的數據存入該數組,並返回讀取的字符個數
}
}
三個小練習{
public class FileWriterDemo { public static void main(String[] args) throws IOException{ //創建流對象 FileWriter fw = new FileWriter("f:\\ab.txt"); //對該文件進行寫操作 fw.write("gsgsdfhdsfh"+System.getProperty("line.separator")+"sdfsdf"); //關閉該流 fw.close(); } }
public class FileReaderDemo { private static final int BUFF = 1024; public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //創建一個輸入流對象,明確源 FileReader fr = new FileReader("f:\\ab.txt"); //對該文件進行寫的操作 // 利用循環。將該文件所有數據讀取, //一個一個讀取 // int ch = 0; // while((ch=fr.read()) != -1){ // System.out.print((char)ch); // } //按數組讀取 char[] buf = new char[BUFF]; int len = 0; while((len=fr.read(buf)) != -1){ System.out.print(new String(buf, 0, len)); } //關閉該輸入流 fr.close(); } }
package io.test; public class CopyFileDemo { private static final int BUFF = 1024; public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //創建一個輸入文件流和一個輸出文件流 FileReader fr = new FileReader("f:\\ab.txt"); FileWriter fw = new FileWriter("f:\\ab_copy.txt"); //利用循環對該文件進行讀,在寫到另一個文件 char[] buf = new char[BUFF]; int len = 0; while((len=fr.read(buf)) != -1){ fw.write(new String(buf, 0, len)); } fr.close(); fw.close(); } }
}
緩衝流{
BufferedWriter{
作用:創建緩衝區對象並與被緩衝的流對象相關聯,以提高寫入效率
原理:先將數據轉入緩衝區,再一起將其轉入目的地
常用方法{
void write( ) 將數據寫入緩衝區中
void flush( ) 將緩衝區數據寫入關聯的文件
void close( ) 關閉緩衝區,同時將關聯的流一併關閉
void newLine( ) 寫入一個行分隔符(即換行)
}
}
BufferedReader{
作用:用作讀文件的緩衝區
常用方法:
string readLine( ) 讀取文件的行,補包含換行符(即讀到換行符停止)
}
練習{
//利用緩衝流的新方法readLine String line = null; while((line=br.readLine()) != null){ bw.write(line); bw.newLine(); }
//自定義一個緩衝流 public class MyBufferedReader { private Reader r = null; private char[] buff = new char[1024]; private int count = 0; private int pos = 0; public MyBufferedReader(Reader r){ this.r = r; } public int myRead() throws IOException{ if(count == 0){ count = r.read(buff); pos = 0; } if(count == -1) return -1; count--; return buff[pos++]; } public String myReadLine() throws IOException{ StringBuffer sb = new StringBuffer(); int ch = 0; while((ch=myRead()) != -1){ if(ch == '\r') continue; if(ch == '\n') return sb.toString(); sb.append((char)ch); } if(sb.length() != 0) return sb.toString(); return null; } }
}
}
}
字節流{
定義;基本操作思想與字符流相同,只不過單元不同
對象類:InputStream OutputStream(write,直接把數據寫入目的地,不需要flush)
FileInputStream 有一個獨特的方法 int available() 返回該輸入文件流綁定的文件的大小
}
轉換流{
InputStreamReader 將字節流轉換爲字符流,以便使用字符流的方法,需要將字節流對象作爲構造參數傳入
OutputStreamWriter 將字符流轉換回字節流,需要將字節流對象作爲構造參數傳入
練習
//將鍵盤上輸入的信息,在控制檯輸出 public class KeyboardInputDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub InputStream in = System.in; //將字節流轉換爲字符流來使用 InputStreamReader isr = new InputStreamReader(in); //爲了高效加入緩衝流 BufferedReader br = new BufferedReader(isr); OutputStream out = System.out; //爲了將接受到的字符流輸出到控制檯,就必須轉換成字節流 OutputStreamWriter osw = new OutputStreamWriter(out); //同樣,爲了高效,加入緩衝流 BufferedWriter bw = new BufferedWriter(osw); String line = null; line = br.readLine(); bw.write(line); bw.flush(); } }
}
總結{
1.明確源和目的
源: InputStream Reader
2.明確數據類型目的: OutputStream Writer
源:是文本數據: InputStream 不是 Reader
目的:是文本數據:OutputStream 不是 Writer
3.明確具體設備
源: 硬盤: File類型的流 鍵盤: System.in 內存: 數組 網絡:Socket流
4.明確是否需要其他額外功能目的: 硬盤: File類型的流 鍵盤: System.in 內存: 數組 網絡:Socket流
需要高效: 緩衝流BufferedReader BufferedWriter
需要轉換: 轉換流InputStreamReader OutputSteamWriter
FileWriter 其實就是轉換流制定了本機默認碼錶的體現,而且這個轉換流的子類對象可以方便操作文本文件
即:文件字符流 = 文件字節流 + 轉換流 + 默認編碼表
注意{
轉換流在源或目的對應的設備是字節流的,但是操作的是文本數據的時候使用
只有轉換流能指定編碼表(InputstreamReader OutputStreamWriter)
}
}