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型值。