java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别
[Java教程]Java字節(jié)流與字符流的區(qū)別
0 2017-05-22 12:00:42
字節(jié)流與和字符流的使用非常相似,兩者除了操作代碼上的不同之外,是否還有其他的不同呢?
實(shí)際上字節(jié)流在操作時(shí)本身不會(huì)用到緩沖區(qū)(內(nèi)存),是文件本身直接操作的,而字符流在操作時(shí)使用了緩沖區(qū),通過緩沖區(qū)再操作文件,如圖12-6所示。
下面以兩個(gè)寫文件的操作為主進(jìn)行比較,但是在操作時(shí)字節(jié)流和字符流的操作完成之后都不關(guān)閉輸出流。
范例:使用字節(jié)流不關(guān)閉執(zhí)行Java代碼
package?org.lxh.demo12.byteiodemo;
import?java.io.File;
import?java.io.FileOutputStream;
import?java.io.OutputStream;
public?class?OutputStreamDemo05?{
public?static?void?main(String[]?args)?throws?Exception?{???//?異常拋出,??不處理
//?第1步:使用File類找到一個(gè)文件
File?f?=?new?File("d:"?+?File.separator?+?"test.txt");?//?聲明File??對象
//?第2步:通過子類實(shí)例化父類對象
OutputStream?out?=?null;
//?準(zhǔn)備好一個(gè)輸出的對象
out?=?new?FileOutputStream(f);
//?通過對象多態(tài)性進(jìn)行實(shí)例化
//?第3步:進(jìn)行寫操作
String?str?=?"Hello?World!!!";
//?準(zhǔn)備一個(gè)字符串
byte?b[]?=?str.getBytes();
//?字符串轉(zhuǎn)byte數(shù)組
out.write(b);
//?將內(nèi)容輸出
//?第4步:關(guān)閉輸出流
//?out.close();
//?此時(shí)沒有關(guān)閉
}
}
程序運(yùn)行結(jié)果:
此時(shí)沒有關(guān)閉字節(jié)流操作,但是文件中也依然存在了輸出的內(nèi)容,證明字節(jié)流是直接操作文件本身的。而下面繼續(xù)使用字符流完成,再觀察效果。
范例:使用字符流不關(guān)閉執(zhí)行Java代碼
package?org.lxh.demo12.chariodemo;
import?java.io.File;
import?java.io.FileWriter;
import?java.io.Writer;
public?class?WriterDemo03?{
public?static?void?main(String[]?args)?throws?Exception?{?//?異常拋出,??不處理
//?第1步:使用File類找到一個(gè)文件
File?f?=?new?File("d:"?+?File.separator?+?"test.txt");//?聲明File?對象
//?第2步:通過子類實(shí)例化父類對象
Writer?out?=?null;
//?準(zhǔn)備好一個(gè)輸出的對象
out?=?new?FileWriter(f);
//?通過對象多態(tài)性進(jìn)行實(shí)例化
//?第3步:進(jìn)行寫操作
String?str?=?"Hello?World!!!";
//?準(zhǔn)備一個(gè)字符串
out.write(str);
//?將內(nèi)容輸出
//?第4步:關(guān)閉輸出流
//?out.close();
//?此時(shí)沒有關(guān)閉
}
}
程序運(yùn)行結(jié)果:
程序運(yùn)行后會(huì)發(fā)現(xiàn)文件中沒有任何內(nèi)容,這是因?yàn)樽址鞑僮鲿r(shí)使用了緩沖區(qū),而?? 在關(guān)閉字符流時(shí)會(huì)強(qiáng)制性地將緩沖區(qū)中的內(nèi)容進(jìn)行輸出,但是如果程序沒有關(guān)閉,則緩沖區(qū)中的內(nèi)容是無法輸出的,所以得出結(jié)論:字符流使用了緩沖區(qū),而字節(jié)流沒有使用緩沖區(qū)。
提問:什么叫緩沖區(qū)?
在很多地方都碰到緩沖區(qū)這個(gè)名詞,那么到底什么是緩沖區(qū)?又有什么作用呢?
回答:緩沖區(qū)可以簡單地理解為一段內(nèi)存區(qū)域。
可以簡單地把緩沖區(qū)理解為一段特殊的內(nèi)存。
某些情況下,如果一個(gè)程序頻繁地操作一個(gè)資源(如文件或數(shù)據(jù)庫),則性能會(huì)很低,此時(shí)為了提升性能,就可以將一部分?jǐn)?shù)據(jù)暫時(shí)讀入到內(nèi)存的一塊區(qū)域之中,以后直接從此區(qū)域中讀取數(shù)據(jù)即可,因?yàn)樽x取內(nèi)存速度會(huì)比較快,這樣可以提升程序的性能。
在字符流的操作中,所有的字符都是在內(nèi)存中形成的,在輸出前會(huì)將所有的內(nèi)容暫時(shí)保存在內(nèi)存之中,所以使用了緩沖區(qū)暫存數(shù)據(jù)。
如果想在不關(guān)閉時(shí)也可以將字符流的內(nèi)容全部輸出,則可以使用Writer類中的flush()方法完成。
范例:強(qiáng)制性清空緩沖區(qū)Java代碼
package?org.lxh.demo12.chariodemo;
import?java.io.File;
import?java.io.FileWriter;
import?java.io.Writer;
public?class?WriterDemo04?{
public?static?void?main(String[]?args)?throws?Exception?{?//?異常拋出不處理
//?第1步:使用File類找到一個(gè)文件
File?f?=?new?File("d:"?+?File.separator?+?"test.txt");//?聲明File
對象
//?第2步:通過子類實(shí)例化父類對象
Writer?out?=?null;
//?準(zhǔn)備好一個(gè)輸出的對象
out?=?new?FileWriter(f);
//?通過對象多態(tài)性進(jìn)行實(shí)例化
//?第3步:進(jìn)行寫操作
String?str?=?"Hello?World!!!";
//?準(zhǔn)備一個(gè)字符串
out.write(str);
//?將內(nèi)容輸出
out.flush();
//?強(qiáng)制性清空緩沖區(qū)中的內(nèi)容
//?第4步:關(guān)閉輸出流
//?out.close();
//?此時(shí)沒有關(guān)閉
}
}
程序運(yùn)行結(jié)果:
此時(shí),文件中已經(jīng)存在了內(nèi)容,更進(jìn)一步證明內(nèi)容是保存在緩沖區(qū)的。這一點(diǎn)在讀者日后的開發(fā)中要特別引起注意。
提問:使用字節(jié)流好還是字符流好?
學(xué)習(xí)完字節(jié)流和字符流的基本操作后,已經(jīng)大概地明白了操作流程的各個(gè)區(qū)別,那么在開發(fā)中是使用字節(jié)流好還是字符流好呢?
回答:使用字節(jié)流更好。
在回答之前,先為讀者講解這樣的一個(gè)概念,所有的文件在硬盤或在傳輸時(shí)都是以字節(jié)的方式進(jìn)行的,包括圖片等都是按字節(jié)的方式存儲(chǔ)的,而字符是只有在內(nèi)存中才會(huì)形成,所以在開發(fā)中,字節(jié)流使用較為廣泛。
字節(jié)流與字符流主要的區(qū)別是他們的的處理方式
流分類:
1.Java的字節(jié)流
InputStream是所有字節(jié)輸入流的祖先,而OutputStream是所有字節(jié)輸出流的祖先。
2.Java的字符流
Reader是所有讀取字符串輸入流的祖先,而writer是所有輸出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象類。所以不能直接new
字節(jié)流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進(jìn)制數(shù)據(jù),它是按字節(jié)來處理的
但實(shí)際中很多的數(shù)據(jù)是文本,又提出了字符流的概念,它是按虛擬機(jī)的encode來處理,也就是要進(jìn)行字符集的轉(zhuǎn)化
這兩個(gè)之間通過 InputStreamReader,OutputStreamWriter來關(guān)聯(lián),實(shí)際上是通過byte[]和String來關(guān)聯(lián)
在實(shí)際開發(fā)中出現(xiàn)的漢字問題實(shí)際上都是在字符流和字節(jié)流之間轉(zhuǎn)化不統(tǒng)一而造成的
在從字節(jié)流轉(zhuǎn)化為字符流時(shí),實(shí)際上就是byte[]轉(zhuǎn)化為String時(shí),
public String(byte bytes[], String charsetName)
有一個(gè)關(guān)鍵的參數(shù)字符集編碼,通常我們都省略了,那系統(tǒng)就用操作系統(tǒng)的lang
而在字符流轉(zhuǎn)化為字節(jié)流時(shí),實(shí)際上是String轉(zhuǎn)化為byte[]時(shí),
byte[]??? String.getBytes(String charsetName)
也是一樣的道理
至于java.io中還出現(xiàn)了許多其他的流,按主要是為了提高性能和使用方便,
如BufferedInputStream,PipedInputStream等。學(xué)習(xí)Java的同學(xué)注意了!!!
學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群,群號碼:618528494我們一起學(xué)Java!
本文網(wǎng)址:http://www.shaoqun.com/a/309046.html
*特別聲明:以上內(nèi)容來自于網(wǎng)絡(luò)收集,著作權(quán)屬原作者所有,如有侵權(quán),請聯(lián)系我們:admin@shaoqun.com。
JAVA
0
總結(jié)
以上是生活随笔為你收集整理的java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp是在html里面嵌入哪种代码?_奶
- 下一篇: java 并发_Java并发防范机制