fileinputstream_Java I/O 流之 FileInputStream
一、FileInputStream 簡介
1、概念
FileInputStream 是 Java 語言中抽象類 InputStream 用來具體實現類的創建對象。FileInputStream 流被稱為文件字節輸入流,意思指對文件數據以字節的形式進行讀取操作如讀取圖片視頻等。
2、構造方法
1)通過打開與 File 類對象代表的實際文件的鏈接來創建 FileInputStream 流對象
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();}if (file.isInvalid()) {throw new FileNotFoundException("Invalid file path");} // 一系列合法性的判斷fd = new FileDescriptor(); // 以下均是對成員變量的構造fd.attach(this);path = name;open(name); // 調用native方法打開文件 }若 File 類對象的所代表的文件不存在、不是文件是目錄、或者其他原因不能打開的話,則會拋出 FileNotFoundException 異常。2)通過指定的字符串參數來創建File類對象,而后再與 File 對象所代表的實際路徑建立鏈接創建 FileInputStream 流對象
public FileInputStream(String name) throws FileNotFoundException {this(name != null ? new File(name) : null);}通過查看源碼,發現該構造方法等于是在第一個構造方法的基礎上進行延伸的,因此規則也和第一個構造方法一致:3)通過 fdObj 文件描述符來作為參數,文件描述符是指與計算機系統中的文件的連接,前面兩個方法的源碼中最后都是利用文件描述符來建立連接的(了解)
public FileInputStream(FileDescriptor fdObj) {SecurityManager security = System.getSecurityManager();if (fdObj == null) {throw new NullPointerException();}if (security != null) {security.checkRead(fdObj);}fd = fdObj;path = null;fd.attach(this); }二、FileInputStream 常用方法
1、read() 從輸入流中讀取一個字節返回int型變量,若到達文件末尾,則返回-1
public int read() throws IOException源碼:public class FileStream {public static void main(String[] args) {//建立文件對象File file = new File("D:test1.txt");try {//建立鏈接FileInputStream fileInputStream = new FileInputStream(file);int n = 0;StringBuffer sBuffer=new StringBuffer();while (n != -1){ //當n不等于-1,則代表未到末尾n = fileInputStream.read();//讀取文件的一個字節(8個二進制位),并將其由二進制轉成十進制的整數返回char by = (char) n; //轉成字符sBuffer.append(by);}System.out.println(sBuffer.toString());} catch (FileNotFoundException e) {System.out.println("文件不存在或者文件不可讀或者文件是目錄");} catch (IOException e) {System.out.println("讀取過程存在異常");} } }最后輸出內容和 1.txt 內容一致是:123總結:從(來源)輸入流中(讀取的內容)讀取數據的下一個字節到(去處)java程序內部中返回值為0到255的int類型的值,返回值為字符的ACSII值(如a就返回97,n就返回110).如果沒有可用的字節,因為已經到達流的末尾, -1返回的值運行一次只讀一個字節,所以經常與while((len = inputstream.read()) != -1)一起使用2、read(byte[] b) 從輸入流中讀取 b.length 個字節到字節數組中,返回讀入緩沖區的總字節數,若到達文件末尾,則返回-1
public int read(byte[] b) throws IOException源碼:public int read(byte b[]) throws IOException {return readBytes(b, 0, b.length); }查看此方法源碼,發現其本質是調用的其它方法 readBytes(b, 0, b.length);
總結:從(來源)輸入流中(讀取內容)讀取的一定數量字節數,并將它們存儲到(去處)緩沖區數組b中返回值為實際讀取的字節數運行一次讀取一定的數量的字節數.java會盡可能的讀取b個字節,但也有可能讀取少于b的字節數.至少讀取一個字節第一個字節存儲讀入元素b[0],下一個b[1],等等。讀取的字節數是最多等于b的長度。如果沒有可用的字節,因為已經到達流的末尾, -1返回的值 如果b.length==0,則返回03、read(byte[] b,int off,int len) 從輸入流中讀取最多len個字節到字節數組中(從數組的off位置開始存儲字節),當len為0時則返回0,如果len不為零,則該方法將阻塞,直到某些輸入可用為止
public int read(byte[] b,int off,int len) throws IOException源碼:public int read(byte b[], int off, int len) throws IOException {if (b == null) {throw new NullPointerException();} else if (off < 0 || len < 0 || len > b.length - off) {throw new IndexOutOfBoundsException();} else if (len == 0) {return 0;}int c = read();if (c == -1) {return -1;}b[off] = (byte)c;int i = 1;try {for (; i < len ; i++) {c = read();if (c == -1) {break;}b[off + i] = (byte)c;}} catch (IOException ee) {}return i;}總結:讀取 len字節的數據從輸入流到一個字節數組。試圖讀取多達 len字節,但可能讀取到少于len字節。返回實際讀取的字節數為整數。 第一個字節存儲讀入元素b[off],下一個b[off+1],等等。讀取的字節數是最多等于len。k被讀取的字節數,這些字節將存儲在元素通過b[off+k-1]b[off],離開元素通過b[off+len-1]b[off+k]未受影響。4、close() 關閉此輸入流并釋放與該流關聯的所有系統資源---即釋放與實際文件的連接
public void close() throws IOException三、FileInputStream 常用 API 總結
1、為什么 read() 無參方法讀取一個字節,返回的是一個 int 類型,而不是一個byte類型?
因為字節輸入流可以操作任意類型的文件,比如圖片音頻等,這些文件底層都是以二進制形式的存儲的,如果每次讀取都返回 byte,有可能在讀到中間的時候遇到 111111111(文件的底層按補碼來存儲的):
那么這 11111111 是 byte 類型的 -1,我們的程序是遇到 -1 就會停止不讀了,后面的數據就讀不到了,所以在讀取的時候用 int 類型接收,如果 11111111 會在其前面補上 24 個 0 湊足 4 個字節,那么 byte 類型的 -1 就變成 int 類型的 255 了,這樣可以保證整個數據讀完,而結束標記的 -1 就是 int 類型。
2、三種 read 方法效率比較
查看三種 read 方法源碼,其本質都是利用 for 循環對內容進行單字節的讀取,但從代碼形式看,使用 read(byte[] b) 較為直觀和簡便,因此項目中可以此方法為主進行數據讀取。
知乎視頻?www.zhihu.com希望可以幫到大家~
總結
以上是生活随笔為你收集整理的fileinputstream_Java I/O 流之 FileInputStream的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四元数c语言,C + OpenGL四元数
- 下一篇: android 模糊查询控件_第三十二篇