黑馬程序員_IO流1

  ------- 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("文件名"));


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章