序
好記性不如爛筆頭,這是我學習編程以來,最大的感受,無論你曾經多麼的優秀,如果你沒有一個良好的複習體系,那麼你是很難學好一門技術的,甚至其他領域。
IO
IO指的是input和output
IO流是解決設備與設備之間的傳輸問題 比如:硬盤到內存,內存到硬盤
其中,input指的是輸入,是輸入內存。output指的是輸出,是輸出內存。簡單來說就是input讀取文件,output寫文件,其實我更願意通過內存來理解。
inputstream和outputstream
inputstream是字節輸入流,能夠讀取流中的字節寫入到內存中
outputstream是字節輸出流,能夠將流中的字節寫出到內存去
public class Test {
public static void main(String [] args ) throws Exception {
//將文件實例化爲一個對象
File f1 = new File("ceshi.txt");
File f2 = new File("ceshi2.txt");
//將輸入流與文件輸入流綁定、輸出流綁定
InputStream is = new FileInputStream(f1);
OutputStream os = new FileOutputStream(f2);
//將輸入流讀到的字節數存到一個字節數組中去
byte[] bitArr = new byte[1024];
is.read(bitArr);
//將讀好的字節數組寫到另外一個文件裏面去
os.write(bitArr);
//最後要把流關閉
is.close();
os.close();
}
}
//測試結果:將ceshi.txt文件的內容寫到了ceshi2.txt中去。
Bufferedinputstream 和 BufferedOutputstream
Bufferedinputstream——緩衝輸入字節流
BufferedOutputstream——緩衝輸出字節流
public class Test {
public static void main(String [] args ) throws Exception {
//將文件實例化爲一個對象
File f1 = new File("ceshi.txt");
File f2 = new File("ceshi2.txt");
//將輸入流與文件輸入流綁定、輸出流綁定
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f1));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f2));
//讀取字節數據到一個數組文件中
byte [] arr = new byte[1024*10];
bis.read(arr);
//將讀取到的字節數組文件寫到另一個文本上
bos.write(arr);
//關閉流
bis.close();
bos.close();
}
}
Reader和Writer
reader——字符輸入流
writer——字符輸出流
public class Test {
public static void main(String [] args ) throws Exception {
//將文件實例化爲一個對象
File f1 = new File("ceshi.txt");
File f2 = new File("ceshi2.txt");
//將輸入流與文件輸入流綁定、輸出流綁定
Reader r = new FileReader(f1);
Writer w = new FileWriter(f2);
//讀數據
char[] arr = new char[1024*10];
r.read(arr);
//寫數據
w.write(arr);
}
}
bufferedreader和bufferedwriter
bufferedreader——字符輸入緩存流
bufferedwriter——字符輸出緩存流
與上面所不同的是,除了能讀單個,讀多個,這個流還有擴展的方法,能夠一次性讀取一行,但是他在寫的時候不會自動換行,需要nextLine()方法手動
public class Test {
public static void main(String [] args ) throws Exception {
//將文件實例化爲一個對象
File f1 = new File("ceshi.txt");
File f2 = new File("ceshi2.txt");
//將輸入流與文件輸入流綁定、輸出流綁定
BufferedReader br = new BufferedReader(new FileReader(f1));
BufferedWriter bw = new BufferedWriter(new FileWriter(f2));
//讀取一行
String s ="";
while((s = br.readLine())!= null ) {
bw.write(s);
bw.newLine();
}
//結束流
br.close();
bw.close();
}
}
InputstreamReader和OutputstreamReader
inputstreamreader 可以從輸入流中讀取原始的字節,根據指定的編碼形式,將字節轉換成Unicode字符
outputstreamwrite 可以從輸出流中接收Unicode字符,通過指定的編碼形式轉換成字節,再將這些字節寫入底層輸出流
讀字節流,輸出字符流
//將文件實例化爲一個對象
File f1 = new File("ceshi.txt");
File f2 = new File("ceshi2.txt");
//bufferedreader讀取的是字符流,如果想用文件讀字節再變成字符的話,需要通過inputstream轉換
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f1)));
//bufferedwriter 寫的是字符流,可以直接將剛剛讀到的字符流寫入。
BufferedWriter bw = new BufferedWriter(new FileWriter(f2));
//讀數據
String src = null ;
while((src = br.readLine())!=null) {
bw.write(src);
bw.newLine();
bw.flush();
}
//關流
br.close();
bw.close();
讀字符流,輸出字節流
注意不要以爲所有帶Reader/Writer後綴的都是與字節流無關
建議翻看JDK API
//將文件實例化爲一個對象
File f1 = new File("ceshi.txt");
File f2 = new File("ceshi2.txt");
//用字符流綁定
BufferedReader br = new BufferedReader(new FileReader(f1));
//用字節流綁定,因爲內存中讀到的是字符流,所以這裏用outputStreamWriter轉成字節
//注意不要以爲所有帶Reader/Writer後綴的都是與字節流無關,如果沒想明白建議翻看JDK API
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f2)));
//讀數據
String src = null ;
while((src = br.readLine())!=null) {
bw.write(src);
bw.newLine();
bw.flush();
}
//關流
br.close();
bw.close();
轉換流還有一個作用就是改變輸出數據的編碼,通過fileinputstream 和 fileoutputstream的方法可以控制讀和寫的編碼方式。