1. 程式人生 > >Java IO深入理解FileInputStream

Java IO深入理解FileInputStream

一 FileInputStream概述

FileInputStream為檔案輸入流,以位元組流的形式讀取檔案內容,比如圖片檔案等等。

FileInputStream是InputStream的子類,我們可以把FileInputStream賦值給InputStream使用。

如果我們要以字元流形式讀取檔案內容,可以使用FileReader類處理。

二 FileInputStream例項分析

FileInputStream的父類是InputStream,原始碼結構如下,

構造器:

public FileInputStream(File file) throws FileNotFoundException;

public FileInputStream(FileDescriptor fdObj);

public FileInputStream(String name) throws FileNotFoundException;

方法:

public int available() throws IOException;

public void close() throws IOException;

protected void finalize() throws IOException;

public FileChannel getChannel();

public final FileDescriptor getFD() throws IOException;

public int read() throws IOException;

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

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

public long skip(long n) throws IOException;

以下對部分重要常用方法進行分析。

read()

FileInputStream的read()方法一次從檔案輸入流中一次讀取一個位元組。

該方法返回讀取到包含一個位元組內容的int變數。如果read()方法返回-1,

說明程式已經讀到了流的末尾,你可以關閉流。從原始碼read()方法的返回值

我們可以知道這裡的-1是一個int型別,不是byte型別。

哪麼為啥返回int值呢?

因為byte正好是一個位元組,是一個有符號的資料,不便於處理,最主要的是

它無法表示是否成功讀到資料。而int的表值範圍比較大,可用0~255來表示

讀到的位元組值,而讀到的若是-1,則表示沒能讀到資料。

eg:

package com.lanhuigu.io.fileinputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * read()
 */
public class TestFileInputStream1 {

    public static void main(String[] args) {
        // 指定構建檔案
        File file = new File("C:\\mycode\\hello.txt");
        // 根據檔案建立檔案輸入流
        try (InputStream is = new FileInputStream(file)) {
            // 用於封裝字串的StringBuilder
            StringBuilder sb = new StringBuilder();
            // 從檔案輸出流中讀取第一個位元組
            int data = is.read();
            while (data != -1) {
                sb.append((char)data);
                // 讀取下一個位元組
                data = is.read();
            }
            // 列印檔案內容
            System.out.println("檔案內容:" + sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
read(byte[] b)

FileInputStream的read(byte[] b)方法從檔案輸入流中讀取給定陣列長度的位元組,

儲存在位元組陣列中。

eg:

package com.lanhuigu.io.fileinputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * read(byte[] b)
 */
public class TestFileInputStream2 {

    public static void main(String[] args) {
        // 指定構建檔案
        File file = new File("C:\\mycode\\hello.txt");
        // 根據檔案建立檔案輸入流
        try (InputStream is = new FileInputStream(file)) {
            // 建立緩衝位元組陣列,用於儲存從檔案輸出流讀取的內容
            byte[] data = new byte[1024];
            // 從檔案輸入流中讀取資料儲存到緩衝位元組陣列中
            is.read(data);
            // 列印檔案內容
            System.out.println("檔案內容:" + new String(data));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

read(byte[] b, int off, int len)

FileInputStream的read(byte[] b, int off, int len)方法從檔案輸入流中offset位置,

讀取length長度位元組,儲存在位元組陣列中。

eg:

package com.lanhuigu.io.fileinputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * read(byte[] b, int off, int len)
 */
public class TestFileInputStream3 {

    public static void main(String[] args) {
        // 指定構建檔案
        File file = new File("C:\\mycode\\hello.txt");
        // 根據檔案建立檔案輸入流
        try (InputStream is = new FileInputStream(file)) {
            // 建立緩衝位元組陣列,用於儲存從檔案輸出流讀取的內容
            byte[] data = new byte[1024];
            // 從檔案輸入流中讀取資料儲存到緩衝位元組陣列中
            is.read(data);
            // 列印檔案內容
            System.out.println("檔案內容:" + new String(data));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

相關推薦

Java IO深入理解FileInputStream

一 FileInputStream概述 FileInputStream為檔案輸入流,以位元組流的形式讀取檔案內容,比如圖片檔案等等。 FileInputStream是InputStream的子類,我們可以把FileInputStream賦值給InputStream使用。 如

Java IO深入理解File

一 File概述 儲存在變數、陣列和物件中的資料是暫時的,當程式終止時他們就會丟失,為了能夠永久的儲存程式中建立的資料,需要將他們儲存到硬碟或光碟的檔案中。 而File類關心的是在磁碟上檔案的儲存,File類描述的是一個檔案或資料夾。File類的出現是對檔案系統的中的檔案以

Java IO流 之 FileInputStream 讀取文件

nta out 文件中 AI In string nal trace input http://www.verejava.com/?id=1699461971466 package com.io; import java.io.*; public class TestI

【小家Java深入理解Java列舉型別(enum)及7種常見的用法(含EnumMap和EnumSet)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

Java併發-深入理解ThreadLocal

一、ThreadLocal是什麼? ThreadLocal與執行緒同步機制不同,執行緒同步機制是多個執行緒共享同一個變數,而ThreadLocal是為每一個執行緒建立一個單獨的變數副本,故而每個執行緒都可以獨立地改變自己所擁有的變數副本,而不會影響其他執行緒所對應的副本。可以

Java 集合深入理解(4):List 介面

在 Java 集合深入理解:Collection 中我們熟悉了 Java 集合框架的基本概念和優點,也瞭解了根介面之一的 Collection,這篇文章來加深 Collection 的子介面之一 List 的熟悉。 List 介面 一個 List 是一個元素有

Java併發-深入理解Semaphore(訊號量)之原始碼解析

深入理解Semaphore(訊號量) Semaphore藉助AQS Sync 繼承 AbstractQueuedSynchronizer(AQS同步器) NonfairSync Sync的非公平實現 FairSync Sync的公平實現 為什麼沒有實

初學Java IO之使用FileInputStream和FileReader讀取檔案 四十一

import java.io.*; public class FileInputStreamTest { public static void main(String[] args) throws IOException { //建立位元組輸入流 FileInputStream fis =

初學Java IO之使用FileInputStream和FileReader讀取文件 四十一

ava sys 字符串 imp ont new ati args fileread import java.io.*; public class FileInputStreamTest { public static void main(String[] args) t

Java角度深入理解Kotlin

前言 前幾個月,在組內分享了關於Kotlin相關的內容。但由於PPT篇幅的原因,有些內容講的也不是很詳細。另外本人也參與了扔物線組織的 碼上開學,該社群主要用於分享 Kotlin 和 Jetpack 相關的技術, 如果您對Kotlin或者Jetpack使用上有想要分享的地方,也歡迎您

Java 集合深入理解(3):Collection

今天心情有點粉,來學學 Collection 吧! 什麼是集合? 集合,或者叫容器,是一個包含多個元素的物件; 集合可以對資料進行儲存,檢索,操作; 它們可以把許多個體組織成一個整體: 比如一副撲克牌(許多牌組成的集合); 比如一個電話本

Java 集合深入理解(9):Queue 佇列

今天心情不太好,來學一下 List 吧! 什麼是佇列 佇列是資料結構中比較重要的一種型別,它支援 FIFO,尾部新增、頭部刪除(先進佇列的元素先出佇列),跟我們生活中的排隊類似。 佇列有兩種: 單佇列 迴圈佇列 單佇

CSDN博文週刊第4期:從Java角度深入理解Kotlin

CSDN每週都會產生大量的部落格文章,有一些優質的乾貨文章值得被更多人閱讀,分享。CSDN博文週刊會從過去一週博文中精心挑選一些優質文章來以饗讀者,陪伴大家度過一個愉快週末。 程式語言 1、從Java角度深入理解Kotlin Java開發者跟準備入門Kotlin開發可以讀讀,

Java併發--深入理解執行緒池

為什麼需要執行緒池 在生產環境中,我們不能無限制的建立執行緒,主要原因如下: 執行緒建立與銷燬的代價並不低; 如果可執行的執行緒數量多於可用處理器的數量,有些執行緒將會閒置,大量閒置的執行緒會消耗系統資源(記憶體)並給垃圾收集器帶來壓力; 大量執行緒競爭C

Java 集合深入理解(14):Map 概述

終於把 List 常用的幾種容器介紹完了,接下來開始 Map 的相關介紹。 什麼是 Map Java 中的 Map 介面 是和 Collection 介面 同一等級的集合根介面,它 表示一個鍵值對 (key-value) 的對映。類似數學

Java 集合深入理解(17):HashMap 在 JDK 1.8 後新增的紅黑樹結構

上篇文章我們介紹了 HashMap 的主要特點和關鍵方法原始碼解讀,這篇文章我們介紹 HashMap 在 JDK1.8 新增樹形化相關的內容。 讀完本文你將瞭解到: 傳統 HashMap 的缺點 JDK 1.8 以前 HashMap 的實

Java 集合深入理解(7):ArrayList

今天心情有點美麗,學學 ArrayList 放鬆下吧! 什麼是 ArrayList ArrayList 是 Java 集合框架中 List介面 的一個實現類。 可以說 ArrayList 是我們使用最多的 List 集合,它

Java 集合深入理解(15):AbstractMap

今天來了解下 AbstractMap。 什麼是 AbstractMap AbstractMap 是 Map 介面的的實現類之一,也是 HashMap, TreeMap, ConcurrentHashMap 等類的父類。 Abst

Java 集合深入理解(6):AbstractList

今天心情比天藍,來學學 AbstractList 吧! 什麼是 AbstractList AbstractList 繼承自 AbstractCollection 抽象類,實現了 List 介面 ,是 ArrayList 和 Abstr

Java NIO深入理解通道之間資料傳輸

在Java NIO中,如果兩個通道中有一個是FileChannel,那你可以直接將資料從一個channel(通道)傳輸到另外一個channel。通道之間資料傳輸方法:transferFrom(),transferTo() transferFrom()FileChannel的