黑馬程序員_java_IO流_FileWriter_FileReader_BufferedWriter_BufferedReader_IO異常

  ------- android培訓java培訓、期待與您交流! ----------



一、IO概述


IO流用來處理設備之間的數據傳輸
java對數據的操作是通過流的方式
java用於操作流的對象都在IO包中
流按照操作數據分爲兩種流:字節流和字符流
流按流向分爲:輸入流,輸出流






二、FileWriter類的基本應用


/*
IO有四個基類字節流兩個基類:
InputStream  OutputStream


字符流兩個基類
Reader Writer


字符流的特點:
既然IO流是用於操作數據的。
那麼數據的最常見體現形式就是:文件


那麼先以操作的文件爲主來演示。
需求:
在硬盤上,創建一個文件並寫入一些文字數據。
找到一個專門用於操作文件的Writer子類對象。  FileWriter. 後綴名是父類名,前綴名是該流對象的功能。




*/
import java.io.FileWriter;
import java.io.IOException;


class FileWriterDemo 
{
	public static void main(String[] args) throws IOException
	{
		/*
		創建一個FileWriter對象。該對象一被初始化就必須要明確被操作的文件
		而且該文件會被創建多指定目錄下,如果該目錄下已有同名文件,將被覆蓋。
		其實該步就是在明確數據要存放的目的地
		*/
		FileWriter fw = new FileWriter("hello.txt");
		
		//調用write方法,將字符串寫入到流中
		fw.write("大家好");


		/*
		刷新對象中的緩衝區中的數據。
		將數據刷到目的地中。
		*/
		//fw.flush();


		/*
		關閉流資源,但是關閉之前會刷新一次內部的緩衝區中的數據。
		將數據刷新到目的地中。和flush區別:flush刷新後,流可以繼續使用。close刷新後,會將流關閉。
		*/
		fw.close();
	}
}


三、FileReader類的基本應用


import java.io.FileReader;
import java.io.IOException;
import java.io.FileNotFoundException;


class FileReaderDemo 
{
	public static void main(String[] args) 
	{
		//創建一個文件讀取流對象,和指定名稱的文件想關聯。
		//要保證該文件是已經存在的,如果不存在,會發生FileNotFoundException
		FileReader fr = null;
		//diYi(fr);
		diEr(fr);
	}


	//第一種讀取方式,運用字符讀取
	public static void diYi(FileReader fr)
	{
		try
		{
			fr = new FileReader("Demo.txt");
			int num = 0; //定義變量。記錄讀取的元素個數
			try
			{
				//調用讀取流的read方法,   read();一次讀取一個字符,而且會自動往下讀。
				while((num = fr.read()) != -1) //只要文本中還有文字就一直讀取
				{
					System.out.println("cha" + (char)num); //把讀取的文字強轉成字符打印輸出
				}
			}
			catch (IOException e) //處理異常
			{
				System.out.println(e.toString());
			}
			
		}
		catch (FileNotFoundException e) //處理異常
		{
			System.out.println(e.toString());
		}
		finally
		{
			if(fr != null) //如果fr不爲空纔會往下執行
				try
				{
					fr.close(); //關閉資源
				}
				catch (IOException e) //處理異常
				{
					System.out.println(e.toString());
				}
		}
	}


	//第二種讀取方式,運用字符讀取
	public static void diEr(FileReader fr)
	{
		try
		{
			fr = new FileReader("demo.txt"); //對fr進行實例化


			//定義一個字符數組,用於存儲讀到的字符
			//該read(char[])返回的是讀取到的字符串的個數
			char[] ch = new char[1024]; 
			int num = 0; //記錄住打印的字符個數
			try
			{
				while((num = fr.read(ch)) != -1) //判斷。只要字符還有就一直打印
				{ 
					System.out.println(new String(ch, 0, num)); //把int強轉成字符串打印輸出
				}	
			}
			catch (IOException e) //處理異常
			{
				System.out.println(e.toString());
			}
			
		}
		catch (FileNotFoundException e) //處理異常
		{
			System.out.println(e.toString());
		}
		finally
		{
			if(fr != null) //判斷只要fr是否被初始化過
				try
				{
					fr.close(); //關閉資源
				}
				catch (IOException e) //處理異常
				{
					System.out.println(e.toString());
				}
		}
	}


}



四、BufferedWrider類的基本應用


/*
緩衝區的出現是爲了提高流的操作效率而出現的。
所以咋i創建緩衝區執勤啊,必須要現有流對象。
該緩衝區中提供了一個跨平臺的換行符
newLine();
*/
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;


class BufferedWriterDemo
{
	public static void main(String[] args)
	{
		//創建一個字符寫入流對象
		FileWriter fw = null;


		//爲了提高字符寫入了效率,加入了緩衝技術。
		//只要將需要被提高效率的流對象作爲參數傳遞個緩衝區的構造函數即可。
		BufferedWriter bufw = null;
		try
		{
			fw = new FileWriter("Demo.txt");
			bufw = new BufferedWriter(fw);
			for(int i = 0; i < 6; i++)
			{
				bufw.write("abcd" + i);
				bufw.newLine();
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("讀入失敗");
		}
		finally
		{
			if(bufw != null);
			try
			{
				//記住,只要用到緩衝區,就要記得刷新。
				bufw.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("讀入失敗");
			}
		}
	}
}


五、BufferedReader類的基本應用


/*
字符串讀取流緩衝區
該緩衝區提供了一個一次讀一行的方法readLine(), 方便於對文本數據的獲取。
當返回null時,表示讀到文件末尾。
readLine方法返回的時候只返回回車符之前的數據內容,並不返回回車符
*/
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;


class BufferedReaderDemo 
{
	public static void main(String[] args) 
	{
		//創建一個讀取流對象和文件關聯
		FileReader fr = null;


		//爲了提高效率,假如緩衝區技術。將字符讀取流對象作爲參數傳遞給緩衝對象的構造函數。
		BufferedReader bufr = null;
		try
		{
			fr = new FileReader("Demo.txt");
			bufr = new BufferedReader(fr);
			String num = null; //定義一個空的字符串
			while((num = bufr.readLine()) != null) //判斷當讀取到空的時候停止循環
			{
				System.out.println(num);	
			}
		}
		catch (IOException e) //處理異常
		{
			throw new RuntimeException("讀取失敗");
		}
		finally
		{
			if(bufr != null) //判斷bufr是否被實例化
				try
				{
					bufr.close(); //關閉資源
				}
				catch (IOException e) 
				{
					throw new RuntimeException("讀取失敗"); //處理異常
				}
		}
	}
}



六、IO異常的處理方式


/*
IO異常的處理方式
*/
import java.io.FileWriter;
import java.io.IOException;


class FileWriterDemo1 
{
	public static void main(String[] args) 
	{
		//創建文本
		FileWriter fw = null;


		//把可能會出現的異常進行try{}chach{}捕獲處理
		try
		{
			fw = new FileWriter("demo.txt"); //對文本進行初始化
			fw.write("大家好"); //往文本中添加內容
		}
		catch (IOException e)
		{
			System.out.println(e.toString()); //處理異常
		}
		finally
		{
			//因爲關閉資源的時候有可能出現異常。必須對其進行捕獲
			try
			{
				if(fw != null) //判斷一下。只有當文本創建成功後才能進行關閉
					fw.close(); //關閉資源
			}
			catch (IOException e)
			{
				System.out.println(e.toString());
			}
		}
	}
}


七、裝飾類概述


裝飾設計模式
當想要對已有的對象進行功能增強時,
可以定義類,將已有對象傳入,基於已有的功能,並提供加強功能。
那麼自定義的該類稱爲裝飾類。


示例代碼:
class Person //定義一個類
{
	public void chiFan()
	{
		System.out.println("chifan");
	}
}


class SuperPerson //對類進行裝飾
{
	private Person p;
	SuperPerson(Person p)
	{
		this.p = p;
	}


	public void chiFan()
	{
		System.out.println("抽根菸");
		p.chiFan();
		System.out.println("躺一會");
	}
}


class  
{
	public static void main(String[] args) 
	{
		Person p = new Person();
		p.chiFan();
		SuperPerson sp = new SuperPerson(p);
		sp.chiFan();
	}
}





裝飾類通常會通過構造方法接收被裝飾的對象。
並基於被裝飾類的對象的功能,提供更強的功能


裝飾設計模式的特點:
裝飾設計模式比繼承要靈活。避免了繼承體系臃腫。
而且降低了類與類之間的關係。


裝飾類因爲增強已有對象。具備的功能和已有的是相同的,只不過提供了更強功能。
所以裝飾類和被裝飾類通常都是屬於一個體系中的。






八、給讀取內容添加行號自定義


import java.io.Reader;
import java.io.FileReader;
import java.io.IOException;


class MyLineNumberReader
{
	private int numberReader;
	private Reader r;
	MyLineNumberReader(Reader r)
	{
		this.r = r;
	}


	//寫一個讀取行的函數
	public String myReadLine() throws IOException
	{
		//讀取行之前想讓行號自增
		numberReader++;
		//建一個容器
		StringBuffer sb = new StringBuffer();
		int num = 0; //記錄取出的長度
		while((num = r.read()) != -1) //只要還有字符就一直讀下去。
		{
			if(num == '\r')
				continue;
			else if(num == '\n')
				return sb.toString(); //如果碰到換行符。就把數據反出去
			else
				sb.append((char)num); //如果沒有以上情況。就把數據存入到容器中
		}
		if(sb.length() != 0) //只要容器中還有數據。就把數據反出去
			return toString();
		return null; //如果沒有數據則返回空
	}


	//提供關閉資源的方法
	public void myClose() throws IOException
	{
		r.close();
	}


	//提供修改行號的方法
	public void setLineNumberReader(int numberReader)
	{
		this.numberReader = numberReader;
	}


	//獲取行號
	public int getNumberReader()
	{
		return numberReader;
	}
}


class MyNumberReaderDemo
{
	public static void main(String[] args)
	{
		//和要讀取的數據建立關聯
		FileReader fr = null;
		MyLineNumberReader mr = null;
		try
		{
			fr = new FileReader("BufferedCopy.java");
			mr = new MyLineNumberReader(fr);
			mr.setLineNumberReader(200);
			String len = null;
			while((len = mr.myReadLine()) != null)
			{
				System.out.println(mr.getNumberReader() + "::::" + len);
			}
		}
		catch (IOException e)
		{
			throw new RuntimeException("讀取失敗");
		}
		finally
		{
			if(mr != null)
				try
				{
					mr.myClose();
				}
				catch (IOException e)
				{
					throw new RuntimeException("讀取失敗");
				}
		}
	}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------


詳細請查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>

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