1. 程式人生 > >Android基礎之IO流

Android基礎之IO流

多謝 jametang25 和 孜燃 兩位兄弟的部落格:
https://blog.csdn.net/u014529755/article/details/50984310
https://blog.csdn.net/qq_15059163/article/details/80723556

一 概述:

1 概述

檔案在程式中是以流的形式來操作的,流:是一組有順序的,有起點和終點的位元組集合,是對資料傳輸的總稱或抽象。即資料在兩個儲存位置之間的傳輸稱為流。流的本質是資料傳輸,根據資料傳輸特性將流抽象為各種類,方便更直觀的進行資料操作,按照流向,劃分為 輸入流 和 輸出流,這兩個方向的流是以記憶體為參照,資料從記憶體流向檔案則為輸出流,資料從檔案流向記憶體則維輸入流。而且,按照傳輸單位劃分為位元組流和字元流,位元組流可以用於讀寫二進位制檔案及任何型別檔案,字元流可以用於讀寫文字檔案。可以將流理解為記憶體和檔案之間的管道。

2 位元組流和字元流
2.1 位元組流和字元流概述
Java IO中用於讀寫檔案的四個抽象類:Reader,Writer,InputStream,OutputStream

根據流所處理的資料型別分為兩類:
(1)位元組流:用於處理位元組資料。(InputStream,OutputStream)
(2)字元流:用於處理字元資料,Unicode字元資料。(Reader,Writer)

在Java中IO操作也是有相應步驟的,以檔案操作為例,主要的操作流程如下:

    使用File類開啟一個檔案
    通過位元組流或字元流的子類,指定輸出的位置
    進行讀/寫操作
    關閉輸入/輸出

IO操作屬於資源操作,一定要記得關閉
2.2 字元流和位元組流的區別
區別1 :讀寫單位不同,位元組流以位元組(1 tyte = 8bit)為單位,字元流以字元為單位
區別2 :處理物件不同,位元組流可以處理所有型別的資料(如圖片等等),而字元流只能處理字元類資料
區別3 :快取。位元組流在操作的時候本身是不會用到緩衝區的,是檔案本身的直接操作的;而字元流在操作的時候下後是會用到緩衝區的,是通過緩衝區來操作檔案。

注意:優先選用位元組流。因為硬碟上的所有檔案都是以位元組的形式進行傳輸或者儲存的,包括圖片等內容。字元只是在記憶體中才會形成的,所以在開發中,位元組流使用廣泛。

二 位元組流

InputStream : 是所有位元組輸入流的父類,一般使用它的子類FileInputStream等,它能輸入位元組流;
OutputStream : 是所有位元組輸出流的父類,一般使用它的子類FileOutputStream等,它能輸出位元組流

1 InputStream
FileInputStream:檔案輸入流,用於從檔案讀取資料。它的物件可以用關鍵字 new 來建立,它有多種構造方法可用來建立

建立方法1
InputStream f = new FileInputStream("/data/data/包名/file/hello.text");

建立方法2
File f = new File("/data/data/包名/file/hello.text");
InputStream out = new FileInputStream(f);

三個重要方法:都是將內容以位元組(byte)的形式讀取到輸入流中
    int read()
    int read(byte[] b)
    int read(byte[] b , int off ,int len)
2 OutputStream

檔案輸出流,用於向檔案寫入資料,如果該流在開啟檔案進行輸出前,目標檔案不存在,該流不會建立該檔案,並丟擲FileNotFindException,有兩個構造方法可以用來建立 FileOutputStream 物件。

建立方法1:
OutputStream f = new FileOutputStream("/data/data/包名/file/hello.text")

建立方法2:
File f = new File("/data/data/包名/file/hello.text");
OutputStream f = new FileOutputStream(f);

三個重要方法:從輸出流寫出資料到檔案中

    void write(byte[]/char[] b)
    void write(byte[]/char[] b, int off, int len)
    void write(int b)

三 字元流

1 Reader

Reader : 所有字元輸入流的父類,它以字元流的形式輸入

三個重要方法:將內容以字元(char)的形式讀取到輸入流中
int read()
int read(char[] b)
int read(char[] b , int off ,int len)
2 Writer

Writer : 所有字元輸出流的父類,它以字元流的形式輸出

三個重要方法:從輸出流寫出資料到檔案中
void write(byte[]/char[] b)
void write(byte[]/char[] b, int off, int len)
void write(int b)

四 記憶體與外部資源進行資料流互動的型別分類

如果與記憶體互動的是檔案,則使用檔案流;如果與記憶體進行互動的是陣列,則使用陣列流,其他類似,如下表。

在這裡插入圖片描述
圖片來自 :https://blog.csdn.net/u014529755/article/details/50984310

而這些型別的流的一些常用的處理方式。如下表:
在這裡插入圖片描述
圖片來自 :https://blog.csdn.net/u014529755/article/details/50984310

五 流互動之檔案操作流

位元組流: FileInputStream ,FileOutputStream
字元流: FileReader, FileWriter(用法與位元組流基本相同)

1 FileInputStream
    File file =new File("檔案路徑"); //1.指定要讀 的檔案目錄及名稱
   
    FileInputStream fis =new FileInputStream(file);  //2.建立檔案讀入流物件
    
    fis.close(); //3.關閉流
2 FileOutputStream
    File file =new File("檔案路徑");//1.指定要寫到的檔案目錄及名稱    
    
    FileOutputStream fos =new FileOutputStream(file);    //2.建立檔案讀入流物件  
    
    fos.write(要寫出的位元組或者位元組陣列);//3.定義結束標誌
    
    fos.flush();//4.重新整理流
    
    fos.close(); //5.關閉流

六 流處理之轉換流

InputStreamReader 和OutputStreamWriter,這兩個類是將位元組流轉換為字元流的類,InputStreamReader 可以將一個InputStream轉換為Reader,OutputStreamWriter可以將一個OutputStream轉換為Writer。

1 InputStreamReader
構造方法1 : ​ // 用預設字符集建立一個InputStreamReader物件
InputStreamReader(InputStream in)

構造方法2 : // 接受已指定字符集名的字串,並用該字符集建立物件
InputStreamReader(InputStream in,String CharsetName)
2 OutputStreamWriter
構造方法1 : ​ // 用預設字符集建立一個OutputStreamWriter物件
OutputStreamWriter(OutputStream in)

構造方法2 : // 接受已指定字符集名的字串,並用該字符集建立OutputStreamWriter物件
OutputStreamWriter(OutputStream in,String CharsetNarme)

七 流處理之字元列印流

PrintWriter 是字元型別的列印輸出流,它繼承於Writer,該類可用來建立一個檔案並向文字檔案寫入資料。可以理解為java中的檔案輸出。

構造方法1
pw = new PrintWriter("f://aaa.txt");
pw.print("Hello World");
pw.close();

構造方法2
File file = new File("f://ccc.txt");
System.out.println(file.exists());//輸出為false,因為本地沒有ccc.txt
 PrintWriter pw = null;
 pw = new PrintWriter(file);//先建立ccc.txt(若存在,則不會建立)
 pw.print("Hello World");
 pw.close();
 
常用方法:
print(String str):向檔案寫入一個字串。
print(char[] ch):向檔案寫入一個字元陣列。
print(char c):向檔案寫入一個字元。
print(int i):向檔案寫入一個int型值。
print(long l):向檔案寫入一個long型值。
print(float f):向檔案寫入一個float型值。
print(double d):向檔案寫入一個double型值。
print(boolean b):向檔案寫入一個boolean型值。

待續。。。。。。