----------------------ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------
黑馬程序員_java基礎流操作(文件)篇Day3
今天聽了畢老師的第二部分java視頻,對知識做一個總結,同時也加上自己的理解。
流操作是相當有趣的一個話題,寫文件,讀文件,讀圖片,讀視頻(媽媽再也不用擔心我們的學習了,想讀哪裏讀哪裏),雖然可以讀很多的東西,但一見到文件的操作對象就犯暈,其實聽畢老師已將,也就那麼回事(是不是有那麼一點誇張啊)。
我們先把這些對象列出來。
#第一部分#
輸入流:InputStream Reader 讀
輸出流:OutStream Writer 寫
加上兩個常用的轉換流對象InputStreamReader將輸入的字節流變爲字符流, OutputStreamWriter將一個字符流的輸出對象變爲字節流輸出對象。
Buffered
如果我們想提高效率,我們就會用到Buffered,也就是我們的緩衝區。緩衝區的出現就是爲了提高效率的。同時Buffered也提供了新的有效方法如newline(),readLine()。
我們在這可以看一個緩衝區的例子:
For(int x=0;x<5;x++)
{
Buff.write(“abcd”);
buff.newLine();
Buff.flush();
}
不要Buff.flush();行嗎?不行,由於字符是屬於緩衝區的,但我們不刷新又開始寫,那麼以前的將會被覆蓋。
readLine()中一個容易出錯的例子
While(buff.readLine()!=null){
System.out.printf(buff.readLine());
}
這樣會報錯,應加上str=buff.readLine()
ReadLine()的原理,無論是讀取一行,獲取多個字符,其實最終都是在硬盤上一個個讀取的,所以最終是要的還是read方法。
這裏有一個必須注意的:
FileWriter並不直接是Writer的子類,而是OutputStreamWriter的子類, 而FileReader也不直接是Reader的子類, 是InputStreamReader的子類,那麼從這兩個類的繼承關係就可以清楚地發現, 不管是使用字節流還是字符流實際上最終都是以字節的形式操作輸入/輸出流的。
#第二部分#
流操作的規律,就要掌握三個要點,開始前我們就問自己三個問題
第一:明確輸入流於輸出流,就是我要讀的是什麼?
文本?是的則用字符流對象Reader,爲什麼不用InputStream?因爲一般我們讀取文本都用字符流,這涉及字符流編碼的問題。
第二:Reader選好了,我們還要想一想是什麼設備輸入的,如果是文件用FileReader,但是如果用的是鍵盤呢?那轉換流就派上用場了,System.in是字節流,我們要將他轉化爲
字符流,InputStreamReader isr=new InputStreamReader (System.in);這是從鍵盤接收。
第三:做好了上面的兩步,說明我們,可以建立了讀的流對象,fr.read()/isr.read()
我們可以讀取了,但是我們也想提交效率,怎麼辦,這是Buffered上場了,
我們以個例子來看看效率:
部分代碼:
沒用Buffered讀的視頻
fis=new FileInputStream("D:\\1234567.avi");
fos=new FileOutputStream("D:/happy.avi");
byte[] b=new byte[1024];
int len=0;
while((len=fis.read(b))!=-1)
{
fos.write(b);
}
用Buffered讀
fis=new FileInputStream("D:\\1234567.avi");
bis=new BufferedInputStream(fis);
fos=new FileOutputStream("D:/happy.avi");
bos=new BufferedOutputStream(fos);
byte[] b=new byte[1024];
int len=0;
while((len=bis.read(b))!=-1)
{
bos.write(b);
}
再來看一個例子
1,從鍵盤上讀取一個字符到文件
InputStreamReader isr=new InputStreamReader(System.in);
// int a=isr.read();
BufferedReader br=new BufferedReader(isr);
int a=br.read();
FileWriter fw=new FileWriter("D:/demo.txt");
fw.write(a);
//System.out.println((char)(a));
br.close();
fw.close();
其實讀取圖片,視頻的原理都一樣,這裏就不在囉嗦了,繼續看視頻去!
----------------------ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------