首頁  >  文章  >  Java  >  Java中位元組流和字元流是什麼

Java中位元組流和字元流是什麼

王林
王林轉載
2023-05-08 21:46:23737瀏覽

位元組流與字元流 

Java中位元組流和字元流是什麼

在上圖中,橘色部分是抽象類,而藍色部分則是實作類別

位元組流 

位元組流,顧名思義就是將資料細分為位元組對檔案進行讀取和寫入的操作, 主要分為位元組輸入流和位元組輸出流。

位元組輸入流 

下面是位元組輸入流中常用到的建構器與方法:

建構器 說明
public        FileInputStream(File file) 建立位元組輸入流管道與來源檔案物件接通
#public        FileInputStream(String pathname) 建立位元組輸入流管道與來源檔案路徑接通

說明每次讀取一個位元組返回,如果位元組已經沒有可讀的返回-1每次讀取一個位元組數組返回,如果位元組已經沒有可讀的返回-1接下來透過程式碼更好的加深對這部分知識點的理解吧!
File file = new File("File//data.txt");
        //第一种构造器,参数是File类
        InputStream inputStream = new FileInputStream(file);
        //第二种构造器,参数是文件的路径,可以是相对也可以是绝对的路径
        InputStream inputStream1 = new FileInputStream("File//data.txt");
        //通过字节读取文件中的数据
        int len;
        while ((len=inputStream.read()) != -1){
            System.out.print((char) len);
        }
        System.out.println();
        //通过字节数组读取文件中的数据
        byte [] buffer = new byte[3];
        while ((len=inputStream1.read(buffer))!=-1){
            String s = new String(buffer,0,len);
            System.out.print(s);
        }
//输出结果:
//ab1abab
//ab1abab
現在我們看到的輸出結果和檔案中的內容是一一對應的,那麼它就一定是沒有問題的了嗎?其實並不是,只是還沒遇到問題而已,首先我們應該了解到的是,在utf-8中,字母和數字都是一個字節,而中文是由三個字節組成的,那麼當我們的文件中出現漢字的時候,第一種方法就無法實現正常的讀取了,因為每次都讀取一個字節的原因會將漢字拆解,在輸出的時候形成亂碼的情況;而第二種則方法可以在特殊的情況下實現對漢字的輸出,必須滿足的條件是剛好中文的三個位元組都在同一個位元組數組中。 位元組輸入流並不適合所有的文件數據,由此而引出了字元輸入流。 位元組輸出流 下面是位元組輸出流常用來的方法:方法
##方法名稱
public int read()
public int read(byte[ ] buffer)
說明

public void write (int a)

寫一個位元組出去

public void write (byte [ ]buffer )

寫一個位元組數組出去##file .flush()流的更新,還可以繼續寫資料
public void write (byte [ ]buffer,int off, int len) 將一個位元組數組中的一部分寫出去
file.close() #流的關閉,不能再寫資料
# 接下來透過程式碼更好的加深對這部分知識點的理解吧!
OutputStream outputStream = new FileOutputStream("File//data.txt",true);
//true表示可以对文件进行追加内容,若没有true则会在关闭文件之后,进行写文件的时候会对之前的内容进行覆盖。
        outputStream.write('a');
        outputStream.write(13);
        outputStream.write('美');
        outputStream.flush();
        byte[] buffer = {'s','y','l','m',99};
        outputStream.write(buffer);
        outputStream.write(buffer,1,3);
        outputStream.close();
經過上面一系列操作以後,會將這些資料寫進data.txt檔案之中,但是仍然會出現問題,有時無法將中文正常的寫進去,那麼它也不是一個適合所有文件的,由此而引出了字元輸出流。 字元輸入流 建構器說明public FileReader (File file)
字元流 字元流,顧名思義就是將資料細分為字元對檔案進行讀取和寫入的操作, 主要分為字元輸入流和字元輸出流。
 下面是字元輸入流中常用到的建構器與方法:
###建立字元輸入流管道與來源檔案物件接通########## ##public FileReader(String pathname)######建立字元輸入流管道與來源檔案路徑接通#######################方法######說明############public int read()#######每次讀取一個字元返回,如果字元已經沒有可讀的返回-1## ##########public int read(char [ ]buffer)######每次讀取一個字元數組返回,返回讀取的字元數,如果字元沒有可讀的返回- 1############

字符输入流的构造器和方法大致上和字节输入流的相同,不同的地方在于字符输入流是以字符为单位的读取,无论你是字母还是数字,都作为一个字符进行读取,这样便可以避免在读取中文的时候出现乱码的问题。

接下来通过一部分代码来加深对它的理解吧!

File file = new File("File//data.txt");
        //第一种构造器,参数是File类
        FileReader fileReader = new FileReader(file);
        //第二种构造器,参数是文件的绝对路径或者相对路径
        FileReader fileReader1 = new FileReader("File//data.txt");
        //第一种方法,一个一个字符读取
        int len;
        while ((len = fileReader.read())!=-1){
            System.out.print((char) len);
        }
        //第二种方法,以字符数组进行读取
        char []buffer = new char[3];
        while ((len = fileReader1.read(buffer))!=-1){
            String s = new String(buffer,0,len);
            System.out.println(s);
        }
//输出结果:
//110,119,120
//110
//,11
//9,1
//20

通过以字符为单位的读写,便可以避免在读取中文的时候出现乱码的问题了。

字符输出流 

 下面是字符输出流中经常会用到的构造器和方法:

构造器 说明
public FileWriter(File file) 创建字符输出流管道与源文件对象接通
public FileWriter(File file,boolean append) 创建字符输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath) 创建字符输出流管道与源文件路径接通
public FileWriter(String filepath,boolean append) 创建字符输出流管道与源文件路径接通,可追加
方法 说明
void writer(int c) 写入一个字符
void writer (char [ ] buffer) 写入一个字符数组
void writer (char[ ]buffer,int off,int len) 写入字符数组的一部分
void writer(String str)         写入一个字符串
void writer(String str,int off,int len) 写入字符串的一部分
close和flush 输出流的关闭和刷新

接下来就通过代码来加深对它的理解吧!

FileWriter fileWriter = new FileWriter("File//data.txt");
        fileWriter.write('k');
        fileWriter.write('d');
        char []buffer = {'i','r','v','i','n','g'};
        fileWriter.write(buffer);
        fileWriter.flush();
        String s = "James";
        fileWriter.write(s);
        fileWriter.write(s,0,4);
        fileWriter.close();

字符输出流的使用便可以很好地解决了中文不能正常写入文件的问题了。 

附:字节流和字符流的区别

字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。

字节流默认不使用缓冲区;字符流使用缓冲区。

字节流在操作的时候本身是不会用到缓冲区的,是与文件本身直接操作的,所以字节流在操作文件时,即使不关闭资源,文件也能输出;字符流在操作的时候是使用到缓冲区的。如果字符流不调用close或flush方法,则不会输出任何内容。

字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

字节流和字符流的转换

字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化,这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。在从字节流转化为字符流时,实际上就是byte[]转化为String时,而在字符流转化为字节流时,实际上是String转化为byte[]时。

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。

字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

字节流与字符流主要的区别是他们的的处理方式。

以上是Java中位元組流和字元流是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除