IO流第二課InputSteam和FileInputStream的使用
上節課我們講了File類的簡單使用,這節課開始我們將IO流。
IO流裡涉及了一大堆類,首先來看下IO流的體系。
這節課講抽象基類裡的InputStream和以及訪問檔案的FileInputStream
首先說下位元組流和字元流的區別:
其實就是單位的區別,位元組流以位元組為單位進行輸入輸出,字元流以字元為單位進行輸入輸出。
位元組對應的類是Byte(基本資料型別是byte),字元對應的類是Character(基本資料型別是char)
下面來看看InputStream
public abstract class InputStream implements Closeable
可以看到InputStream是一個抽象類,所以 不能直接new物件
然後,InputStream實現了一個介面Closeable,顧名思義就是可關閉的,
來看看Closeable
public interface Closeable extends AutoCloseable { public void close() throws IOException; }
Closeable繼承自AutoCloseable介面,並且聲明瞭一個方法close()
public interface AutoCloseable { void close() throws Exception; }
AutoCloseable裡也有個close方法,只不過這個方法時丟擲的Exception異常
Closeable的close方法和AutoCloseable的close方法都是無參,所以Closeable是重寫了AutoCloseable的close方法,因此實現Closeable介面的類在實現close方法時丟擲的是IOException異常。
所以InputStream需要實現close方法,但InputStream是抽象類,也可以交給子類去實現close,自己本身不需要實現
以下是InputStream自己實現的close方法,可以看見什麼也沒做
public void close() throws IOException {}
原始碼比較複雜,來看看API文件吧,別看錯了,是java.io.InputStream
超類就是父類的意思,super class嘛
構造器:
只有一個無參構造器
方法:
常用的就close和read以及skip(這個都不怎麼用)
然後來看看FileInputStream
public class FileInputStream extends InputStream
FileInputStream繼承自InputStream
可以看到FileInputStream自己又重寫了close方法,而且非常複雜,不用管,只用知道close是關閉系統資源的就可以了。
還是來看API文件:
構造器:
最常用的是第一個和第三個
FileInputStream沒有無參構造器,所以new的時候必須傳入引數
public FileInputStream(String name) throws FileNotFoundException { this(name != null ? new File(name) : null); }
可以看到FileInputStream(String name)這個方法就是根據name來構造一個File物件然後呼叫自身的構造器即FileInputStream(File file)
方法摘要:
常用方法:
常用的就close和read以及skip(這個都不怎麼用)
來用的試試
Demo 1:
public static void main(String[] args) { InputStream is = null; try { File file = new File("F:\\code\\java\\123.txt"); is = new FileInputStream(file); //獲取檔案內容長度 long length = file.length(); byte[] fileContent = new byte[(int)length]; is.read(fileContent); String content = new String(fileContent); System.out.println(content); } catch (FileNotFoundException e) { //由於FileNotFoundException是IOException的子類,所以先捕獲FileNotFoundException e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //我們前面說過finally這部分用來存放釋放資源的程式碼 //現在我們就用來釋放InputStream佔用的資源 try { if (is != null) { is.close(); } } catch (IOException e) { //可以看到丟擲的是IOException,證明了Closeable確實重寫了AutoCloseable的close方法 e.printStackTrace(); } } }
輸出:
123456
可以看到我們通過FileInputStream成功讀取了檔案的內容,這就是通過字元輸入流讀取檔案的辦法