------- android培訓、java培訓、期待與您交流! ----------
一 IO流
1 概述:IO用來操作數據的流
(1)流按操作數據分爲:字節流和字符流
(2)流按流向分爲:輸入流和輸出流
(3)字符流有兩個抽象基類:Reader(讀取流)、Writer(寫入流)
(4)字節流有兩個抽象基類:InputStream(讀取輸入流)、OutputStream(寫入輸出流)
二 字符流
1 FileWriter類,操作文件的字符寫入流
(1)構造函數:
FileWriter fw=new FileWriter("文件地址");該構造函數會拋出異常。如果該文件不存在,則會創建該文件,如果該文件存在,則會覆蓋以有文件
FileWriter fw=new FileWriter("文件地址",boolean append);該構造函數可以選擇文件模式,如果爲true是續寫文件不會覆蓋文件。
(2)方法摘要:
write(String str); 寫字符串
flush(); 刷新流到目的地中
close(); 關閉前先刷新
(3)例子:
import java.io.*;
class IoDemo
{
public static void main(String[] args) throws IOException//主函數拋異常
{
//創建文件寫入流,並指定目的地
FileWriter fw=new FileWriter("FileDemo.txt");
fw.write("abc");//寫入字符串進流中
fw.flush();//刷新流中數據
fw.close();//關閉資源
}
}
2 FileReader類,操作文件的字符讀取流
(1)構造函數:
FileReader fr=new FileReader("文件地址");此構造方法會拋出異常。如果文件不存在就拋出異常,文件尋找則不會。
(2)方法摘要:
read(); 讀一個字節,如果讀到文件的末尾就返回-1
read(char[] buf) ;讀一個數組,會返回讀到的個數,如果返回-1,說明沒有數據了。
(3)例子:
import java.io.*;
class IoDemo
{
public static void main(String[] args) throws IOException//主函數拋異常
{
//創建文件讀取流,並與文件相關聯
FileReader fr=new FileReader("FileDemo.txt");
//兩種讀取方式
//方式一
read1(fr);
//方式二
read2(fr);
}
public static void read1(FileReader fr)throws IOException//方式一,一個一個讀
{
int len=0;
while((len=fr.read())!=-1)
{
System.out.println((char)len);
}
}
public static void read2(FileReader fr)throws IOException//方式二,一個數組一個數組讀
{
int len=0;
char[] ch=new char[1024];//定義一個字符數組
while((len=fr.read(ch))!=-1)
{
System.out.println(new String(ch,0,len));
}
}
}
3 字符流的緩衝區BufferedWriter、BufferedReader
(1)緩衝區的出現是爲了提高流的效率而存在的,所以定義緩衝區時必須要先有流存在
(2)BufferedWriter,字符寫入流的緩衝區
構造方法:BufferedWriter bufw=new BufferedWriter(Writer w);
方法摘要:newLine();換行
(3)BufferedReader,字符讀取流的緩衝區
構造方法:BufferedReader bufr=new BufferedReader(Reader r);
方法摘要:readLine();讀取一行
(4)流的異常處理和加入緩衝技術示例:(複製文件)
import java.io.*;
class BufferedDemo
{
public static void main(String[] args)
{
//緩衝流初始化爲null
BufferedReader bufr=null;
BufferedWriter bufw=null;
try
{
//創建文件讀取流與文件相關聯並加入緩衝技術
bufr=new BufferedReader(new FileReader("Demo.java"));
//創建文件寫入流指定寫入目的地,並加入緩衝技術
bufw=new BufferedWriter(new FileWriter("Demo.txt"));
String line=null;
//讀一行
while ((line=bufr.readLine())!=null)
{
bufw.write(line);//寫一行
bufw.flush();//刷新
bufw.newLine();//換行
}
}
catch (IOException e)
{
throw new RuntimeException("讀寫失敗");
}
finally
{
try
{
if(bufr!=null)
bufr.close();//關閉資源是一定要執行的,多寫在finally中
}
catch (IOException e)
{
throw new RuntimeException("讀取流關閉失敗");
}
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("寫入流關閉失敗");
}
}
}
}
二 字節流
1 用於操作字節數據的流InputStream、OutputStream
2 其子類字節流FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream跟字符流類似
3 通過一個例子複製圖片將這些流都用上
例子:
import java.io.*;
class BufferedDemo
{
public static void main(String[] args)
{
//緩衝流初始化爲null
BufferedInputStream bufi=null;
BufferedOutputStream bufo=null;
try
{
//創建文件讀取流與文件相關聯並加入緩衝技術
bufi=new BufferedInputStream(new FileInputStream("aaa.mp3"));
//創建文件寫入流指定寫入目的地,並加入緩衝技術
bufo=new BufferedOutputStream(new FileOutputStream("bbb.mp3"));
int by=0;
//讀取
while ((by=bufi.read())!=-1)
{
bufo.write(by);//寫入
}
}
catch (IOException e)
{
throw new RuntimeException("讀寫失敗");
}
finally
{
try
{
if(bufi!=null)
bufi.close();//關閉資源是一定要執行的,多寫在finally中
}
catch (IOException e)
{
throw new RuntimeException("讀取流關閉失敗");
}
try
{
if(bufo!=null)
bufo.close();
}
catch (IOException e)
{
throw new RuntimeException("寫入流關閉失敗");
}
}
}
}
2 轉換流
(1)InputStreamReader,字節通向字符的橋樑
(2)OutPutStreamWriter,字符通向字節的橋樑
3 鍵盤錄入
(1)InputStream is=System.in;標準輸入流,鍵盤
(2)OutputStream os=System.out;標準輸出流,控制檯
(3)鍵盤錄入加入緩衝技術,可以讀取一行比較高效。但是readLine()方法是字符流BufferedReader()的方法。所以需要轉換流InputStreamReader將字節流轉換成字符流。
例如:BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
(4)輸入輸出流示例,獲取鍵盤錄入並打印在控制檯上
import java.io.*;
class InOutDemo
{
public static void main(String[] args) throws IOException
{
//獲取鍵盤錄入並加入緩衝技術,需要轉換流
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//獲取輸出流並加入緩衝技術,需要轉換流
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
//讀取鍵盤錄入
String line=null;
while ((line=bufr.readLine())!=null)
{
if("over".equals(line))//判斷結束標記
break;
bufw.write(line);//輸出讀到的字符
bufw.newLine();//換行
bufw.flush();//刷新
}
}
}
4 流操作規律
(1)明確源
字節:InputStream
字符:Reader
文件:FileReader、FileInputStream
緩衝技術:BufferedReader、BufferedInputStream
鍵盤:System.in
轉換流:InputStreamReader
(2)明確目的
字節:OutputStream
字符:Writer
文件:FileWriter、FileOutputStream
緩衝技術:BufferedWriter、BufferedOutputStream
控制檯:System.out
轉換流:OutputStreamWriter
(3)通過以上規律從而確定應該用哪個流。
例如:複製圖片
源:Reader、InputStream
圖片是字節:InputStream
圖片是文件:FileInputStream
需要高效:BufferedInputStream
目的:Writer、OutputStream
圖片是字節:OutputStream
圖片是文件:FileOutputStream
需要高效:BufferedOutputStream
所以可以確定代碼爲:源:BufferedInputStream bufi=new BufferedInputStream(new FileInputStream("文件名"));
目的:BufferedOutputStream bufo=new BufferedOutputStream(new FileOutputStream("文件名"));