tft每日頭條

 > 圖文

 > io流是字符流還是字節流

io流是字符流還是字節流

圖文 更新时间:2024-10-04 03:10:34

io流是字符流還是字節流?所有的字節輸入流繼承 inputStream所有的字節輸出流繼承 outputStream,現在小編就來說說關于io流是字符流還是字節流?下面内容希望能幫助到你,我們來一起看看吧!

io流是字符流還是字節流(IO字節輸入流輸出流的實用講解)1

io流是字符流還是字節流

介紹

  • IO流,主要是用于處理數據的傳輸,包含字節輸入流,字節輸出流,字符輸入流,字符輸出流,今天着重說下字節流;

所有的字節輸入流繼承 inputStream

  • InputStream,這個抽象類是表示輸入字節流的所有類的超類。
  • BufferedInputStream,當創建BufferedInputStream時,将創建一個内部緩沖區數組。 當從流中讀取或跳過字節時,内部緩沖區将根據需要從所包含的輸入流中重新填充,一次有多個字節。 mark操作會記住輸入流中的一點,并且reset操作會導緻從最近的mark操作之後讀取的所有字節在從包含的輸入流中取出新的字節之前重新讀取。
  • byteArrayInputStream,包含一個内部緩沖區,其中包含可以從流中讀取的字節; 内部計數器跟蹤read方法要提供的下一個字節 。
  • FileInputStream,獲取文件輸入流。

所有的字節輸出流繼承 outputStream

  • OutputStream,這個抽象類是表示字節輸出流的所有類的超類。 輸出流接收輸出字節并将其發送到某個接收器。
  • BufferedOutputStream,該類實現緩沖輸出流。 通過設置這樣的輸出流,應用程序可以向底層輸出流寫入字節,而不必為寫入的每個字節導緻底層系統的調用。
  • ByteArrayOutputStream,該類實現了将數據寫入字節數組的輸出流。 當數據寫入緩沖區時,緩沖區會自動增長。
  • FileOutputStream,文件輸出流是用于将數據寫入到文件。

使用輸入流輸出流時注意是否需要成對出現,就好比大管道小管道似的,輸入管道要與輸出管道匹配才行。

IO流使用

使用以上介紹的輸入輸出流,簡單的測試代碼

  • BufferedInputStream

public static void main(String[] args) { try ( InputStream inputStream =new FileInputStream("E:\\測試.txt");//讀取文件輸入流 BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);//聲明BufferedInputStream OutputStream outputStream = new FileOutputStream("E:\\測試輸出.txt"); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream) ){ //每次讀取1024個字節 byte[] buffer=new byte[1024]; int len; //讀到文件末尾時返回-1 while ((len = bufferedInputStream.read(buffer))!=-1){ //b - 數據。 //off - 數據中的起始偏移量。 //len - 要寫入的字節數。 bufferedOutputStream.write(buffer,0,len); } bufferedOutputStream.flush();//刷新此輸出流,并強制将任何緩沖的輸出字節寫入流 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }

  • ByteArrayOutputStream

讀取固定的字節數,效率上肯定是有一定的影響的

public static void main(String[] args) { try(InputStream inputStream =new FileInputStream("E:\\測試.txt");//讀取文件輸入流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { int len = -1; byte[] buffer = new byte[1024]; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } System.out.println(outputStream.toString("gb2312")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }

接着使用StreamUtils或者Hutool工具轉換文件輸入流為字節數組

public static void main(String[] args) { try(InputStream inputStream =new FileInputStream("E:\\測試.txt");//讀取文件輸入流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { byte[] bytes = StreamUtils.copyToByteArray(inputStream); outputStream.write(bytes); System.out.println(outputStream.toString("gb2312")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }

遇到的問題

使用流操作時,就一定要注意資源是否關閉,如果是手動關閉,則需要注意的是關閉的順序,遵循後打開的流先關閉的順序。

如果非正常關閉,則會造成資源的浪費,文件的寫入錯誤,如zip文件會出現 “不可預料的壓縮文件末端”導緻無法打開。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved