java中IO流的字節(jié)流和字符流有什么區(qū)別?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
在子長等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷,外貿(mào)網(wǎng)站建設(shè),子長網(wǎng)站建設(shè)費(fèi)用合理。一、緒論
如果要進(jìn)行文件內(nèi)容的操作那么必須依靠數(shù)據(jù)流完成,而數(shù)據(jù)流分為兩種:
字節(jié)流:InputStream(字節(jié)輸入流)、OutputStream(字節(jié)輸出流);
字符流:Reader(字符輸入流)、Writer(字符輸出流);
二、區(qū)別
字節(jié)流是原生的操作,而字符流是經(jīng)過處理后的操作。
在進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸、磁盤數(shù)據(jù)保存所保存所支持的數(shù)據(jù)類型只有:字節(jié)。而所有磁盤中的數(shù)據(jù)必須先讀取到內(nèi)存后才能進(jìn)行操作,而內(nèi)存中會幫助我們把字節(jié)變?yōu)樽址?。字符更加適合處理中文。如果處理中文使用字符流,其他的任何數(shù)據(jù)都使用字節(jié)流。
三、字節(jié)輸出流:(OutputStream)
OutputStream類定義有三個重要的輸出操作方法:
1. 將給定的字節(jié)數(shù)組內(nèi)容全部輸出:
public void write(byte b[]) throws IOException
2. 將部分字節(jié)數(shù)組內(nèi)容輸出:(重點(diǎn))
public void write(byte b[], int off, int len) throws IOException
3. 輸出單個字節(jié):
public abstract void write(int b) throws IOException
OutputStream是一個抽象類,按照抽象類的基本原則來講,如果想要取得OutputStream類的實例化對象那么一定需要子類,如果要進(jìn)行文件的操作,可以使用FileOutputStream類來處理,這個類的構(gòu)造方法如下:
1. 接收File類(覆蓋):
public FileOutputStream(File file) throws FileNotFoundException
2. 接收File類(追加):
public FileOutputStream(File file, boolean append)
//第一步:定義要輸出的文件的File類對象 File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt"); //輸出信息的時候文件可以不存在,但是目錄必須存在 if(!file.getParentFile().exists()) {//父路徑不存在 file.getParentFile().mkdirs();//創(chuàng)建父路徑 } //第二步:利用OutputStream的子類為父類進(jìn)行實例化 OutputStream output = new FileOutputStream(file); //第三步:輸出文字信息 String msg = "富則達(dá)濟(jì)天下,窮則獨(dú)善其身";//字符串 //為了方便輸出需要將字符串變?yōu)樽止?jié)數(shù)組 byte data[] = msg.getBytes();//變?yōu)樽止?jié)數(shù)組 output.write(data);//輸出數(shù)據(jù) output.close();//關(guān)閉流
輸出文件的部分內(nèi)容
output.write(data,0,10);//輸出部分?jǐn)?shù)據(jù)
使用循環(huán)方式進(jìn)行單個字節(jié)的信息輸出
for(int x = 0;x < data.length; x++) { output.write(data[x]);//單個字節(jié)輸出數(shù)據(jù) }
但是使用單個字節(jié)輸出會將之前的內(nèi)容都被覆蓋了。所以需要進(jìn)行數(shù)據(jù)的追加操作
OutputStream output = new FileOutputStream(file,true);//此處為追加操作
四、字節(jié)輸入流:(InputStream)
InputStream類中定義有三個數(shù)據(jù)的讀取操作方法:
1.讀取單個字節(jié):
public abstract int read() throws IOException;
每次執(zhí)行此方法將讀取當(dāng)個字節(jié)數(shù)據(jù),如果已經(jīng)讀取完成了,那么最后返回-1。
2.讀取數(shù)據(jù)到字節(jié)數(shù)組中:
public int read(byte b[]) throws IOException.
最常用方法,每次講數(shù)據(jù)讀取到數(shù)組之中,那么會返回一個讀取長度的數(shù)據(jù),如果沒有數(shù)據(jù)則返回的長度為-1,
可是要考慮兩種情況:
要讀取的內(nèi)容大于開辟的數(shù)組內(nèi)容:長度就是整個數(shù)組的長度。
要讀取的內(nèi)容小于開辟數(shù)組的內(nèi)容,長度就是全部最后的內(nèi)容長度,數(shù)組裝不滿。
3.讀取部分內(nèi)容到字節(jié)數(shù)組中:
public int read(byte b[], int off,int len) throws IOException
每次讀取內(nèi)容到部分字節(jié)數(shù)組,只允許讀取滿限制的數(shù)組的字節(jié)個數(shù)。此方法依然會返回讀取的長度。
InputStream
是一個抽象類,所以要進(jìn)行文件的讀取使用FileInputStream子類,子類定義的構(gòu)造方法如下:
構(gòu)造方法:public FileInputStream(File file) throws FileNotFoundException.
//第一步:定義要輸出的文件的File類對象 File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt"); //第二步:實例化InputStream InputStream input = new FileInputStream(file); //實現(xiàn)數(shù)據(jù)的讀取操作 byte data[] = new byte[1024]; int len = input.read(data);//將數(shù)據(jù)讀取到數(shù)組之中 System.out.println("讀取的內(nèi)容【" +new String(data,0,len)+"】"); //第四步關(guān)閉輸入流 input.close();
補(bǔ)充:DataInputStream
和 DataOutputStream
DataInputStream類繼承了InputStream。也就是說DataInputStream是InputStream的子類。但它們同是實現(xiàn)了DataInput接口。
DataOutputStream類繼承了OutputStream。也就是說DataOutputStream是OutputStream的子類。但它們同是實現(xiàn)了DataOutput接口。
五、字符輸出流:(Writer)
Writer是一個抽象類,要進(jìn)行文件字符流操作可以使用FileWriter類處理,其構(gòu)造方法為:
public FileWriter(File file)
//第一步:定義要輸出的文件的File類對象 File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路徑 if(!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } Writer out = new FileWriter(file); String str = "一定要好好學(xué)習(xí),天天向上。。。"; out.write(str); out.close();
雖然Writer類提供有字符數(shù)組的輸出操作能力,但是從本質(zhì)上來講使用Writer類就意味著要執(zhí)行字符串的直接輸出。字符流最適合操作中文,但并不意味著字節(jié)流就無法操作中文。
六、字符輸入流:(Reader)
Reader是一個抽象類,要進(jìn)行文件字符流操作可以使用FileReader類處理,其構(gòu)造方法為:
public FileReader (File file)
//第一步:定義要輸出的文件的File類對象 File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路徑 if(file.exists()) { Reader in = new FileReader(file); char data[] = new char[1024]; int len = in.read(data);//向字符數(shù)組保存數(shù)據(jù),返回長度。 System.out.println(new String(data,0,len)); in.close();
七、補(bǔ)充
為了提高字符流讀寫的效率,引入了緩沖機(jī)制,java提供了緩存流類:BufferedInputStream
、BufferedOutputStream
類和BufferedReader
、 BufferedWriter
類
//使用buffer進(jìn)行文件讀寫 BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream (new File("D:\\BIGBANG - IF YOU (Live).mp3"))); File newFile = new File("D:\\copyMusic\\BIGBANG - IF YOU (Live).mp3"); newFile.createNewFile(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(newFile)); byte[] bytes= new byte[1024]; int length = 0; while ((length=bufferedInputStream.read(bytes))!=-1){ bufferedOutputStream.write(bytes,0,length); }
以上就是java中IO流的字節(jié)流和字符流的區(qū)別,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊,感謝各位的閱讀。