溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

java中IO流的字節(jié)流和字符流有什么區(qū)別

發(fā)布時(shí)間:2020-06-22 09:17:03 來(lái)源:億速云 閱讀:167 作者:Leah 欄目:編程語(yǔ)言

java中IO流的字節(jié)流和字符流有什么區(qū)別?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

一、緒論

如果要進(jìn)行文件內(nèi)容的操作那么必須依靠數(shù)據(jù)流完成,而數(shù)據(jù)流分為兩種:

字節(jié)流:InputStream(字節(jié)輸入流)、OutputStream(字節(jié)輸出流);

字符流:Reader(字符輸入流)、Writer(字符輸出流);

二、區(qū)別

字節(jié)流是原生的操作,而字符流是經(jīng)過(guò)處理后的操作。

在進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸、磁盤(pán)數(shù)據(jù)保存所保存所支持的數(shù)據(jù)類(lèi)型只有:字節(jié)。而所有磁盤(pán)中的數(shù)據(jù)必須先讀取到內(nèi)存后才能進(jìn)行操作,而內(nèi)存中會(huì)幫助我們把字節(jié)變?yōu)樽址?。字符更加適合處理中文。如果處理中文使用字符流,其他的任何數(shù)據(jù)都使用字節(jié)流。

三、字節(jié)輸出流:(OutputStream)

OutputStream類(lèi)定義有三個(gè)重要的輸出操作方法:

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. 輸出單個(gè)字節(jié):

public abstract void write(int b) throws IOException

OutputStream是一個(gè)抽象類(lèi),按照抽象類(lèi)的基本原則來(lái)講,如果想要取得OutputStream類(lèi)的實(shí)例化對(duì)象那么一定需要子類(lèi),如果要進(jìn)行文件的操作,可以使用FileOutputStream類(lèi)來(lái)處理,這個(gè)類(lèi)的構(gòu)造方法如下:

1. 接收File類(lèi)(覆蓋)

public FileOutputStream(File file) throws FileNotFoundException

2. 接收File類(lèi)(追加)

public FileOutputStream(File file, boolean append)
        //第一步:定義要輸出的文件的File類(lèi)對(duì)象
        File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");
        //輸出信息的時(shí)候文件可以不存在,但是目錄必須存在
        if(!file.getParentFile().exists()) {//父路徑不存在
            file.getParentFile().mkdirs();//創(chuàng)建父路徑
        }
        //第二步:利用OutputStream的子類(lèi)為父類(lèi)進(jìn)行實(shí)例化
        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)行單個(gè)字節(jié)的信息輸出

for(int x = 0;x < data.length; x++) {
        output.write(data[x]);//單個(gè)字節(jié)輸出數(shù)據(jù)
        }

但是使用單個(gè)字節(jié)輸出會(huì)將之前的內(nèi)容都被覆蓋了。所以需要進(jìn)行數(shù)據(jù)的追加操作

OutputStream output = new FileOutputStream(file,true);//此處為追加操作

四、字節(jié)輸入流:(InputStream)

InputStream類(lèi)中定義有三個(gè)數(shù)據(jù)的讀取操作方法:

1.讀取單個(gè)字節(jié)

public abstract int read() throws IOException;

每次執(zhí)行此方法將讀取當(dāng)個(gè)字節(jié)數(shù)據(jù),如果已經(jīng)讀取完成了,那么最后返回-1。

2.讀取數(shù)據(jù)到字節(jié)數(shù)組中

public int read(byte b[]) throws IOException.

最常用方法,每次講數(shù)據(jù)讀取到數(shù)組之中,那么會(huì)返回一個(gè)讀取長(zhǎng)度的數(shù)據(jù),如果沒(méi)有數(shù)據(jù)則返回的長(zhǎng)度為-1,

可是要考慮兩種情況:

要讀取的內(nèi)容大于開(kāi)辟的數(shù)組內(nèi)容:長(zhǎng)度就是整個(gè)數(shù)組的長(zhǎng)度。

要讀取的內(nèi)容小于開(kāi)辟數(shù)組的內(nèi)容,長(zhǎng)度就是全部最后的內(nèi)容長(zhǎng)度,數(shù)組裝不滿。

3.讀取部分內(nèi)容到字節(jié)數(shù)組中

public int read(byte b[], int off,int len) throws IOException

每次讀取內(nèi)容到部分字節(jié)數(shù)組,只允許讀取滿限制的數(shù)組的字節(jié)個(gè)數(shù)。此方法依然會(huì)返回讀取的長(zhǎng)度。

InputStream是一個(gè)抽象類(lèi),所以要進(jìn)行文件的讀取使用FileInputStream子類(lèi),子類(lèi)定義的構(gòu)造方法如下:

構(gòu)造方法:public FileInputStream(File file) throws FileNotFoundException.
        //第一步:定義要輸出的文件的File類(lèi)對(duì)象
        File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");
        //第二步:實(shí)例化InputStream
        InputStream input = new FileInputStream(file);
        //實(shí)現(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ǔ)充:DataInputStreamDataOutputStream

DataInputStream類(lèi)繼承了InputStream。也就是說(shuō)DataInputStream是InputStream的子類(lèi)。但它們同是實(shí)現(xiàn)了DataInput接口。

DataOutputStream類(lèi)繼承了OutputStream。也就是說(shuō)DataOutputStream是OutputStream的子類(lèi)。但它們同是實(shí)現(xiàn)了DataOutput接口。

五、字符輸出流:(Writer)

Writer是一個(gè)抽象類(lèi),要進(jìn)行文件字符流操作可以使用FileWriter類(lèi)處理,其構(gòu)造方法為:

public FileWriter(File file)
        //第一步:定義要輸出的文件的File類(lèi)對(duì)象
        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類(lèi)提供有字符數(shù)組的輸出操作能力,但是從本質(zhì)上來(lái)講使用Writer類(lèi)就意味著要執(zhí)行字符串的直接輸出。字符流最適合操作中文,但并不意味著字節(jié)流就無(wú)法操作中文。

六、字符輸入流:(Reader)

Reader是一個(gè)抽象類(lèi),要進(jìn)行文件字符流操作可以使用FileReader類(lèi)處理,其構(gòu)造方法為:

public FileReader (File file)
        //第一步:定義要輸出的文件的File類(lèi)對(duì)象
        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ù),返回長(zhǎng)度。
            System.out.println(new String(data,0,len));
            in.close();

七、補(bǔ)充

為了提高字符流讀寫(xiě)的效率,引入了緩沖機(jī)制,java提供了緩存流類(lèi):BufferedInputStream、BufferedOutputStream 類(lèi)和BufferedReaderBufferedWriter類(lèi)

            //使用buffer進(jìn)行文件讀寫(xiě)
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)注億速云行業(yè)資訊,感謝各位的閱讀。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI