1. 程式人生 > >學習筆記之java.io包中的位元組流(上)—— 基本的InputStream和OutputStream

學習筆記之java.io包中的位元組流(上)—— 基本的InputStream和OutputStream

先看下類的宣告:

1 2 public abstract class InputStream implements Closeable public abstract class OutputStream implements Closeable, Flushable

可見此二者都是抽象類,而非介面。也就是說除了分別滿足java.io.Closeable和java.io.Flushable,提供了close()和flush()方法的預設實現外,還給出了其它實現,像InputStream就提供了skip()方法實現等。

我們更關心的是InputStream中的幾個read()方法和OutputStream的幾個write()方法。而實際上最核心的read()和write()方法,InputStream和OutputStream並未給出直接實現,這正是InputStream和OutputStream抽象的地方,我們來看下。

InputStream的read()方法:

  • public abstract int read() throws IOException; 核心read()方法,留給子類實現。
  • public int read(byte b[])
  • public int read(byte b[], int off, int len)

後兩者是呼叫第一個方法讀特定長度的資料放入byte陣列中。

OutputStream的write()方法:

  • public abstract void write(int b) throws IOException; 核心write()方法,留給子類實現。
  • public void write(byte b[])
  •  public void write(byte b[], int off, int len)

和read()類似,把位元組陣列中的特定資料挨個呼叫第一個write()方法寫出。

再說read()和wirte()實現,那麼就要看一下InputStream和OutputStream的子類。我們先來看看InputStream和OutputStream的直接子類。

在java.io中InputStream的直接子類有:

  • java.io.ByteArrayInputStream
  • java.io.FileInputStream
  • java.io.FilterInputStream
  • java.io.ObjectInputStream
  • java.io.PipedInputStream
  • java.io.SequenceInputStream
  • java.io.StringBufferInputStream

而java.io中OutputStream的直接子類有:

  • java.io.ByteArrayOutputStream
  • java.io.FileOutputStream
  • java.io.FilterOutputStream
  • java.io.ObjectOutputStream
  • java.io.PipedOutputStream

這些當中,FileInputStream和FileOutputStream是與外部IO直接有關係的,而FilterInputStream和FilterOutputStream是“裝飾者”設計實現的基類,其它各類都是特定場景下InputStream和OutputStream的實現,我們來具體看看。

1. FileInputStream/FileOutputStream

顧名思義,是檔案的輸入流和輸出流。檔案存在於哪裡呢?通常存在於外部裝置上,這個是這些實現類中比較特殊的。我們如果做過C語言開發,知道我們通常會open作業系統中的檔案,並保留其檔案描述符fd。其實,在Java中我們也有類似的東西。首先,就有fd屬性,它是FileDescriptor類,和C等底層語言中一樣,這實際上是對底層檔案的一個描述符,和底層檔案進行互動的時候少不了它。實際上在FileInputStream/FileOutputStream物件構造方法中,我們初始化了FileDescriptor的fd物件,並呼叫了open()方法。

遺憾的是,像open()、read()、write()、skip()、available()這些FileInputStream/FileOutputStream中的具體操作方法,在(Sun)JDK中都冠以native,即本地實現,這樣做的好處就是上層開發使用者不必關心,統統交由JVM等底層實現進行處理,實現了平臺無關性。

在FileInputStream還有這樣幾個屬性:

  • private final FileDescriptor fd;
  • private FileChannel channel = null;   JDK1.4之後為了支援NIO的Channel操作
  • private final Object closeLock = new Object();  關閉時的併發同步鎖
  • private volatile boolean closed = false; 關閉標誌
  • private static final ThreadLocal<Boolean> runningFinalize =
    new ThreadLocal<>();  finalize是否執行的標誌

此外,再簡要看下FileInputStream構造方法的一個具體實現:

1 2 3 4 5 6 7 8 9 10 11 12 13 public FileInputStream(File file) throws FileNotFoundException { String name = (file != null ? file.getPath() : null); SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(name); } if (name == null) { throw new NullPointerException(); } fd = new FileDescriptor(); fd.incrementAndGetUseCount(); open(name); }

其它過載要麼是呼叫了這個方法,要麼實質上是一致的。FileOutputStream也是類似,出了open()呼叫的時候有一個append屬性引數,標誌是否為檔案追加。

2. ByteArrayInputStream/ByteArrayOutputStream

名稱也很直接,實際上就是位元組陣列,在構造類物件的時候給出一個byte陣列。對於ByteArrayInputStream來說,這個byte陣列就是讀取的源頭,而ByteArrayOutputStream則是write()的目的地。

此外,構造方法中還可以指定這個byte陣列的有效起點和長度。

相關推薦

學習筆記java.io位元組—— 基本InputStreamOutputStream

先看下類的宣告: 1 2 public abstract class InputStream implements Closeable public abstract class

程世東老師TensorFlow實戰——個性化推薦,程式碼學習筆記資料匯入&資料預處理

程式碼來自於知乎:https://zhuanlan.zhihu.com/p/32078473 /程式碼地址https://github.com/chengstone/movie_recommender/blob/master/movie_recommender.ipynb 下一篇有一些資料的

資料結構與演算法學習筆記 提高讀取效能的連結串列

前言   連結串列(Linked list)比陣列稍微複雜一點,在我們生活中用到最常見的應該是快取,它是一種提高資料讀取效能的技術,常見的如cpu快取,瀏覽器快取,資料庫快取等。今天我們就來學習一下連結串列 正文 一、連結串列的定義? 1.一種線性表(資料排成像一條線一樣的結構。每個線性表上的資料最多

LWIP學習筆記用戶編程接口NETCONN(八)

socket api con 數據 實現 學習 數據緩存 用戶 soc 一、定時事件 1、定時結構 2、定時鏈表 3、內核進程 4、處理定時事件 二、消息機制 1、消息結構 2、數據包消息 3、協議棧API實現 4、API消息 三、協議棧接口 1、用戶數據緩存netbuf

程世東老師TensorFlow實戰——個性化推薦,程式碼學習筆記資料匯入&資料預處理

這篇主要是進行程式碼中的一些數值視覺化,幫助理解 程式碼來自於知乎:https://zhuanlan.zhihu.com/p/32078473 /程式碼地址https://github.com/chengstone/movie_recommender/blob/master/movie_re

Android學習筆記NFC近距離無線通訊技術Dean

首先要弄清楚NFC是什麼?   NFC是Near Field Communication縮寫,即近距離無線通訊技術。由飛利浦公司和索尼公司共同開發的NFC是一種非接觸式識別和互聯技術,可以在移動裝置、消費類電子產品、PC 和智慧控制元件工具間進行近距離無線通訊。NFC 提供了一種簡單、觸控式的解決方案,可以

學習筆記aop基於IOC容器的配置MSTzhang

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-

Opencv學習筆記十二——漫水填充法floodFill

首先感謝@淺墨_毛星雲,本篇博文是小武通過學習@淺墨_毛星雲的部落格以及書籍《opencv3.0程式設計入門》整理的筆記及疑問心得,小武水平有限,歡迎交流。定義:漫水填充法是一種用特定的顏色填充聯通區域,通過設定可連通畫素的上下限以及連通方式來達到不同的填充效果的方法。漫水填

《Javascript權威指南》學習筆記十七:BOM新成就1--client存儲數據Storage實現

globals 機制 ng- url new onclick views watermark -c 版權聲明:本文為博主原創文章。未經博主同意不得轉載。 https://blog.csdn

Java IO基礎從這裡開始

  我計劃寫三篇比較長的部落格,來詳細梳理一下java中的IO操作,大致內容是:第一篇介紹相關的類,第二篇整理相關的面試題,第三篇計劃使用這些類和方法完成一個小專案。   每篇文章都不是以往的風格,不在單純的將其作為自己的筆記瞎寫,而是認真的對自己的學習情況整

《機器學習實戰》第五章:Logistic迴歸1基本概念簡單例項

最近感覺時間越來越寶貴,越來越不夠用。不過還是抽空看了點書,然後整理到部落格來。 加快點節奏,廢話少說。 Keep calm & carry on. ----------------------------------------------------------

vue2.0學習筆記webpack-simple模板的路由簡單配置案例

nbsp 主頁 default code vue 兩個文件 new ebp 命名 以下是完成後的目錄結構 案例基礎是已經用 webpack+vue-cli 創建了一個名為 vue_router的工程 , 並安裝了vue-rout

JavaSE 學習筆記Java概述

environ 電子 6.0 run javase 有一點 架構 spa form 一、Java的三種技術架構: JAVAEE:Java Platform Enterprise Edition,開發企業環境下的應用程序,主要針對web程序開發; JAVASE:Java P

算法(第四版)學習筆記java實現可以動態調整數組大小的棧

length pub move sta gen font -c @override lifo 下壓(LIFO)棧:可以動態調整數組大小的實現 import java.util.Iterator; public class ResizingArrayStack&l

IDEA 學習筆記 Java項目開發深入學習1

java項目 bsp 重構 str 代碼提示 log pan ora tro Java項目開發深入學習(1): 定義編譯輸出路徑: 繼承以上工程配置 重新定義新的項目編譯路徑 添加source目錄:點擊添加,再點擊移除: 編譯項目: 常用快捷鍵總結: Ctr

----Java.io精講

1流 API查詢在Java.io包中。 1.1概述 電流, 水流, 車流 , 流是有起點和終點的有序位元組序列的集合 Java中程式中可能會讀寫檔案內容,需要使用IO流, 這個IO流指java.io包中的相關流類 流的分類: 輸入流/輸出流 是以當前程式為參照, 如果程式從外面讀

mybatis學習筆記——mybatis配置資訊引數值的處理

引數值的處理: 單個引數:mybatis不會做特殊處理     #{引數名}:取出引數值 多個引數:mybatis會做特殊處理。     多個引數會封裝成一個map,      &n

Java學習筆記——Java介紹

1.Java體系: JavaSE:標準版,其他兩個體系的基礎 JavaEE:企業版 JavaME:微型版,適用於消費型別的微型裝置   2.Java三大特性:封裝、繼承、多型   3.Java的特點:面向物件、可移植、安全、動態、多執行緒 可移植,一次編譯,到處執行 JV

學習筆記Java執行緒安全雜談——執行緒安全概念基本方案

執行緒安全問題絕對是併發開發中一個重點中的重點,這篇就來說說執行緒安全相關的一些問題。執行緒安全是什麼概念?這個概念說簡單也簡單,說複雜也複雜,“安全”的概念是什麼,用我個人的話說的淺顯些,就是類/物件本身在多執行緒併發執行的場景下,能夠保證程式的邏輯是可以接受的而不是被

MFC學習筆記多對話方塊使用定時器

MFC菜鳥第一次發貼,請各位高人指教:我需要做一個基於對話方塊的程式,主對話方塊TimerTryDlg上就兩個按鈕,確定鈕按下後執行訊息處理OnFirstOK(),先初始化定時器,再開啟有模式對話方塊TestDlg,定時器時間到了執行OnTimer-在子對話方塊上的一個靜態控制元件上畫點,但OnTimer在