JAVA IO流詳解(完)

前一部分點開我的頭像進去可以觀看。

3.3 字符流

3.3.1 Reader類和Writer類

字符流:就是在字節流的基礎上,加上編碼,形成的數據流

字符流出現的意義:因為字節流在操作字符時,可能會有中文導致的亂碼,所以由字節流引申出了字符流。

字符流最基礎的兩個類就是 Reader和 wirter,根據這兩個派生而來類都含有read()和write()` 的基本方法。

處理圖片、視頻、音樂的時候還是用字節流吧,處理文本文件的時候用字符流會好很多。

Reader類常見子類有:

  • FileReader:文件輸入流
  • BufferedReader: 帶緩衝區的字符輸入流

Writer類常見子類有:

  • FileWriter:文件輸出流
  • BufferedWriter:帶緩衝區的字符輸出流

3.3.1.1 FileReader類和FileWriter類

直接看實例吧

<code>publicclassTest{

publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException,IllegalAccessException,InstantiationException{
FileWriterfileWriter=newFileWriter("D:\\\\hello.txt");
//向文件裡面寫入文件
fileWriter.write("123");
//向文件裡面寫入文件,和writer的區別就是append返回的是FileWriter對象,而write沒有返回值
fileWriter.append("helloworld");
fileWriter.append("中");
//把流中的數據刷新到文件中,還能繼續使用
//如果沒有刷新,也沒有關閉流的話數據是不會寫入文件的
fileWriter.flush();
//關閉流
fileWriter.close();
FileReaderfileReader=newFileReader("D:\\\\hello.txt");
intlen=0;
while((len=fileReader.read())!=-1){
System.out.println((char)len);
}
//用char數組讀數據。
char[]chars=newchar[1024];
while((len=fileReader.read(chars))!=-1){
System.out.println(chars);
}
fileReader.close();
}
}
/<code>

FilerWriter 和FileReader 沒啥好講的,具體常用的方法也就上面的,具體使用我也寫在註釋上面了。

3.3.1.2 BufferedReader類和BufferedWriter類

<code>publicclassTest{

publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException,IllegalAccessException,InstantiationException{

//從控制檯得到輸入流
BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(System.in));
//創建文件
BufferedWriterbufferedWriter=newBufferedWriter(newFileWriter("D:\\\\hello.txt"));
Stringinput=null;
while(!(input=bufferedReader.readLine()).equals("exit")){
//將從控制檯得到的數據寫入文件
bufferedWriter.write(input);
//寫入一個當前系統下的空行
bufferedWriter.newLine();
}
bufferedWriter.close();
bufferedReader.close();

}
}
/<code>

寫下面的程序的時候還有一點小插曲,我調用close方法關程序的時候,我調用了兩次bufferedReader.close();這就會導致我的文件裡面沒有數據,痛哭,加了flush發現之後發現文件裡面又有數據了,這個時候突然間有個疑問,難道是BufferedWriter的close()方法裡面沒有調用flush()嗎,要自己手動的調用 flush(),淦,那也太蠢了吧,於是去源碼裡面看了一眼。

<code>publicvoidclose()throwsIOException{
synchronized(lock){
if(out==null){
return;
}
try(Writerw=out){
flushBuffer();
}finally{
out=null;
cb=null;
}
}
}
/<code>

源碼裡面是有flush()操作的呀,為什麼我的程序出問題,一頓檢查之後 發現文末寫了兩個bufferedReader的關閉方法,好吧為自己的愚蠢浪費了十分鐘的時間QAQ。

四、總結

一般大佬都有總結 ,我也寫個總結吧,也算是跟個風。

總的來說這篇文章寫的很差,本來想帶你們詳細看下字節流和字符流的,結果因為年末的時候事情太多,導致我沒有辦法完成這一事情,只能簡略的帶你們看看io是怎麼用的,並沒有看io流為什麼能這樣用,沒有看io流的實現,本質是想一個源碼一個一個源碼的過一邊,一是因為時間不夠,二是因為篇幅太長太枯燥,怕你們也看不下去,只能等以後出單章一個類一個類的源碼解析看看,如果你們想看的話,給我留言吧。

這次不是太滿意 ,希望下篇文章可以寫的滿意些吧。

各位看官覺得寫的還可以的,能點個關注嗎,新人寫者,你們的每一個關注、點贊、轉發,都是支持我寫下去的動力。

JAVA IO流詳解(完)


分享到:


相關文章: