1.基本概念
IO:Java對資料的操作是通過流的方式,IO流用來處理裝置之間的資料傳輸,上傳檔案和下載下傳檔案,Java用于操作流的對象都在IO包中。
2.IO流的分類
圖示:(主要IO流)

3.位元組流
(1).位元組流基類
1).InputStream
InputStream:位元組輸入流基類,抽象類是表示位元組輸入流的所有類的超類。
常用方法:
// 從輸入流中讀取資料的下一個位元組
abstract int read()
// 從輸入流中讀取一定數量的位元組,并将其存儲在緩沖區數組 b中
int read(byte[] b)
// 将輸入流中最多 len 個資料位元組讀入 byte 數組
int read(byte[] b, int off, int len)
// 跳過和丢棄此輸入流中資料的 n個位元組
long skip(long n)
// 關閉此輸入流并釋放與該流關聯的所有系統資源
void close()
2).OutputStream
OutputStream:位元組輸出流基類,抽象類是表示輸出位元組流的所有類的超類。
常用方法:
// 将 b.length 個位元組從指定的 byte 數組寫入此輸出流
void write(byte[] b)
// 将指定 byte 數組中從偏移量 off 開始的 len 個位元組寫入此輸出流
void write(byte[] b, int off, int len)
// 将指定的位元組寫入此輸出流
abstract void write(int b)
// 關閉此輸出流并釋放與此流有關的所有系統資源
void close()
// 重新整理此輸出流并強制寫出所有緩沖的輸出位元組
void flush()
(2).位元組檔案操作流
1).FileInputStream
FileInputStream:位元組檔案輸入流,從檔案系統中的某個檔案中獲得輸入位元組,用于讀取諸如圖像資料之類的原始位元組流。
構造方法:
// 通過打開一個到實際檔案的連接配接來建立一個FileInputStream,該檔案通過檔案系統中的File對象file指定
FileInputStream(File file)
// 通過打開一個到實際檔案的連接配接來建立一個FileInputStream,該檔案通過檔案系統中的路徑name指定
FileInputStream(String name)
常用方法:覆寫和重寫了父類的的常用方法。
// 讀取f盤下該檔案f://hell/test.txt
//構造方法1
InputStream inputStream = new FileInputStream(new File("f://hello//test.txt"));
int i = 0;
//一次讀取一個位元組
while ((i = inputStream.read()) != -1) {
// System.out.print(i + " ");// 65 66 67 68
//為什麼會輸出65 66 67 68?因為字元在底層存儲的時候就是存儲的數值。即字元對應的ASCII碼。
System.out.print((char) i + " ");// A B C D
}
//關閉IO流
inputStream.close();
// 讀取f盤下該檔案f://hell/test.txt
//構造方法2
InputStream inputStream2 = new FileInputStream("f://hello/test.txt");
// 位元組數組
byte[] b = new byte[2];
int i2 = 0;
// 一次讀取一個位元組數組
while ((i2 = inputStream2.read(b)) != -1) {
System.out.print(new String(b, 0, i2) + " ");// AB CD
}
//關閉IO流
inputStream2.close();
注: 一次讀取一個位元組數組,提高了操作效率,IO流使用完畢一定要關閉。
2).FileOutputStream
FileOutputStream:位元組檔案輸出流是用于将資料寫入到File,從程式中寫入到其他位置。
構造方法:
// 建立一個向指定File對象表示的檔案中寫入資料的檔案輸出流
FileOutputStream(File file)
// 建立一個向指定File對象表示的檔案中寫入資料的檔案輸出流
FileOutputStream(File file, boolean append)
// 建立一個向具有指定名稱的檔案中寫入資料的輸出檔案流
FileOutputStream(String name)
// 建立一個向具有指定name的檔案中寫入資料的輸出檔案流
FileOutputStream(String name, boolean append)
常用方法:覆寫和重寫了父類的的常用方法。
OutputStream outputStream = new FileOutputStream(new File("test.txt"));
// 寫出資料
outputStream.write("ABCD".getBytes());
// 關閉IO流
outputStream.close();
// 内容追加寫入
OutputStream outputStream2 = new FileOutputStream("test.txt", true);
// 輸出換行符
outputStream2.write("\r\n".getBytes());
// 輸出追加内容
outputStream2.write("hello".getBytes());
// 關閉IO流
outputStream2.close();
注;輸出的目的地檔案不存在,則會自動建立,不指定盤符的話,預設建立在項目目錄下;輸出換行符時一定要寫\r\n不能隻寫\n,因為不同文本編輯器對換行符的識别存在差異性。
(3).位元組緩沖流(高效流)
1).BufferedInputStream
BufferedInputStream:位元組緩沖輸入流,提高了讀取效率。
構造方法:
// 建立一個 BufferedInputStream并儲存其參數,即輸入流in,以便将來使用。
BufferedInputStream(InputStream in)
// 建立具有指定緩沖區大小的 BufferedInputStream并儲存其參數,即輸入流in以便将來使用
BufferedInputStream(InputStream in, int size)
InputStream in = new FileInputStream("test.txt");
// 位元組緩存流
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bs = new byte[20];
int len = 0;
while ((len = bis.read(bs)) != -1) {
System.out.print(new String(bs, 0, len));
// ABCD
// hello
}
// 關閉流
bis.close();
2).BufferedOutputStream
BufferedOutputStream:位元組緩沖輸出流,提高了寫出效率。
構造方法:
// 建立一個新的緩沖輸出流,以将資料寫入指定的底層輸出流
BufferedOutputStream(OutputStream out)
// 建立一個新的緩沖輸出流,以将具有指定緩沖區大小的資料寫入指定的底層輸出流
BufferedOutputStream(OutputStream out, int size)
常用方法:
// 将指定 byte 數組中從偏移量 off 開始的 len 個位元組寫入此緩沖的輸出流
void write(byte[] b, int off, int len)
// 将指定的位元組寫入此緩沖的輸出流
void write(int b)
// 重新整理此緩沖的輸出流
void flush()
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt", true));
// 輸出換行符
bos.write("\r\n".getBytes());
// 輸出内容
bos.write("Hello Android".getBytes());
// 重新整理此緩沖的輸出流
bos.flush();
// 關閉流
bos.close();
4.字元流
(1).字元流基類
1).Reader
Reader:讀取字元流的抽象類.
常用方法:
// 讀取單個字元
int read()
// 将字元讀入數組
int read(char[] cbuf)
// 将字元讀入數組的某一部分
abstract int read(char[] cbuf, int off, int len)
// 跳過字元
long skip(long n)
// 關閉該流并釋放與之關聯的所有資源
abstract void close()
2).Writer
Writer:寫入字元流的抽象類.
常用方法:
// 寫入字元數組
void write(char[] cbuf)
// 寫入字元數組的某一部分
abstract void write(char[] cbuf, int off, int len)
// 寫入單個字元
void write(int c)
// 寫入字元串
void write(String str)
// 寫入字元串的某一部分
void write(String str, int off, int len)
// 将指定字元添加到此 writer
Writer append(char c)
// 将指定字元序列添加到此 writer
Writer append(CharSequence csq)
// 将指定字元序列的子序列添加到此 writer.Appendable
Writer append(CharSequence csq, int start, int end)
// 關閉此流,但要先重新整理它
abstract void close()
// 重新整理該流的緩沖
abstract void flush()
(2).字元轉換流
1).InputStreamReader
InputStreamReader:位元組流轉字元流,它使用的字元集可以由名稱指定或顯式給定,否則将接受平台預設的字元集。
構造方法:
// 建立一個使用預設字元集的 InputStreamReader
InputStreamReader(InputStream in)
// 建立使用給定字元集的 InputStreamReader
InputStreamReader(InputStream in, Charset cs)
// 建立使用給定字元集解碼器的 InputStreamReader
InputStreamReader(InputStream in, CharsetDecoder dec)
// 建立使用指定字元集的 InputStreamReader
InputStreamReader(InputStream in, String charsetName)
特有方法:
//傳回此流使用的字元編碼的名稱
String getEncoding()
//使用預設編碼
InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"));
int len;
while ((len = reader.read()) != -1) {
System.out.print((char) len);//愛生活,愛Android
}
reader.close();
//指定編碼
InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"),"utf-8");
int len;
while ((len = reader.read()) != -1) {
System.out.print((char) len);//????????Android
}
reader.close();
注:Eclipse預設使用GBK編碼,test.txt檔案是以是GBK編碼,當指定utf-8編碼時是以會亂碼。
2).OutputStreamWriter
OutputStreamWriter:位元組流轉字元流。
構造方法:
// 建立使用預設字元編碼的 OutputStreamWriter
OutputStreamWriter(OutputStream out)
// 建立使用給定字元集的 OutputStreamWriter
OutputStreamWriter(OutputStream out, Charset cs)
// 建立使用給定字元集編碼器的 OutputStreamWriter
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
// 建立使用指定字元集的 OutputStreamWriter
OutputStreamWriter(OutputStream out, String charsetName)
特有方法:
//傳回此流使用的字元編碼的名稱
String getEncoding()
(3).字元緩沖流(高效流)
1).BufferedReader
BufferedReader:字元緩沖流,從字元輸入流中讀取文本,緩沖各個字元,進而實作字元、數組和行的高效讀取。
構造方法:
// 建立一個使用預設大小輸入緩沖區的緩沖字元輸入流
BufferedReader(Reader in)
// 建立一個使用指定大小輸入緩沖區的緩沖字元輸入流
BufferedReader(Reader in, int sz)
特有方法:
// 讀取一個文本行
String readLine()
//生成字元緩沖流對象
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));
String str;
//一次性讀取一行
while ((str = reader.readLine()) != null) {
System.out.println(str);// 愛生活,愛Android
}
//關閉流
reader.close();
2).BufferedWriter
BufferedWriter:字元緩沖流,将文本寫入字元輸出流,緩沖各個字元,進而提供單個字元、數組和字元串的高效寫入。
構造方法:
// 建立一個使用預設大小輸出緩沖區的緩沖字元輸出流
BufferedWriter(Writer out)
// 建立一個使用給定大小輸出緩沖區的新緩沖字元輸出流
BufferedWriter(Writer out, int sz)
特有方法:
// 寫入一個行分隔符
void newLine()
(4).FileReader、FileWriter
FileReader:InputStreamReader類的直接子類,用來讀取字元檔案的便捷類,使用預設字元編碼。
FileWriter:OutputStreamWriter類的直接子類,用來寫入字元檔案的便捷類,使用預設字元編碼。
5.高效流效率比對
讀取f盤下的一個視訊檔案到項目中:檔案大小29.5 MB
讀取方式一:
FileInputStream inputStream = new FileInputStream("f://滑闆//HEEL_FLIP.mp4");
FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
int len;
// 開始時間
long begin = System.currentTimeMillis();
// 一次讀取一個位元組
while ((len = inputStream.read()) != -1) {
outputStream.write(len);
}
// 用時毫秒
System.out.println(System.currentTimeMillis() - begin);// 213195
//關閉流釋放資源
inputStream.close();
outputStream.close();
讀取方式二:
FileInputStream inputStream = new FileInputStream("f://滑闆//HEEL_FLIP.mp4");
FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
int len;
byte[] bs = new byte[1024];
// 開始時間
long begin = System.currentTimeMillis();
// 一次讀取一個位元組數組
while ((len = inputStream.read(bs)) != -1) {
outputStream.write(bs, 0, len);
}
// 用時毫秒
System.out.println(System.currentTimeMillis() - begin);// 281
inputStream.close();
outputStream.close();
讀取方式三:
FileInputStream inputStream = new FileInputStream("f://滑闆//HEEL_FLIP.mp4");
BufferedInputStream bis = new BufferedInputStream(inputStream);
FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
int len;
byte[] bs = new byte[1024];
// 開始時間
long begin = System.currentTimeMillis();
while ((len = bis.read(bs)) != -1) {
bos.write(bs, 0, len);
}
// 用時毫秒
System.out.println(System.currentTimeMillis() - begin);// 78
bis.close();
bos.close();
注:由此可以看出高效緩沖流讀寫速度是非常快的,建議使用。