——IO流之字符流

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

IO流的概述
IO流用來處理設備之間的數據傳輸,

Java對數據的操作是通過流的方式

Java用於操作流的對象都在IO包中

流按操作數據分爲兩種:字節流與字符流。  

流按流向分爲:輸入流,輸出流。


字節流:

     字節流主要用於操作字節類型的數據,比如圖片,視頻,音頻等執行二進制數據,當然也可以處理文本數據。

     字節流的抽象基類:

     InputStream ,OutputStream

字符流:

      字符流主要用於處理文本數據,比如:txt文件,XML文件等這些文本文件

     字符流的抽象基類:

     Reader Writer

注:由這四個類是IO流的基類,其派生出來的子類名稱都是以其父類名作爲子類名的後綴;方式爲:功能+父類名稱。

如:InputStream的子類FileInputStream。

如:Reader的子類FileReader。

字節流與字符流的區別:

  一,字節流操作的數據是字節,字符流操作的數據是字節。

  一,字節流在寫入操作的時候本身是不會用到緩衝區(內存)的,是與文件本身直接操作的;

         而字符流在寫入操作的時候是使用到緩衝區的。

  二,字節流在操作文件時,即使不關閉資源(close方法),文件也能輸出;

         但是如果字符流不使用close方法,也不使用flush方法的話,則不會輸出任何內容,

說明字符流用的是緩衝區,並且可以使用flush方法強制進行刷新緩衝區,這時才能在不close的情況下輸出內容

那開發中究竟用字節流好還是用字符流好呢?

在所有的硬盤上保存文件或進行傳輸的時候都是以字節的方法進行的,包括圖片也是按字節完成,

而字符是只有在內存中才會形成的,所以使用字節的操作是最多的。


以下是字符流的操作:

FileWriter
       創建一個FileWriter對象,該對象一被初始化就必須要明確操作的文。且,該文件會被創建到指定目錄下。如果該目錄下已有同名文件,將被覆蓋。

       但如果在創建流的時候創建的方式是:FileWriter(String fileName, boolean append),將append,設爲true就可以將數據添加到文件末尾。

       其實該步就是在明確數據要存放的目的地。

       字符流在寫入的時候,必須要調用Flush方法,將內存中數據寫入到文件中去。

       字符流在close釋放資源之前會調用一次flush方法刷新一次。

注:如果不刷新流,也不關閉流,則文件寫入失敗!

FileWriter示例代碼:

      

package com.itheima.io.reader_writer;

import java.io.FileWriter;
import java.io.IOException;

/**
 * 寫入文件
 * @author wuyong
 *
 */
public class FileWriterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String name = "D:\\FileWriter.txt";//數據存放目的地,如果不出在則創建一個對應的文件
		FileWriter fw = null;
		try {
		    //次方式創建流,文件會被覆蓋
// 			fw = new FileWriter(name);
            //創建流對象,這種實例化方式,不會把已有文件的內容覆蓋,而是將內容添加到文件末尾
			fw = new FileWriter(name,true);
			fw.write("123你好!");
			fw.append("\r\n再見!");
			fw.flush();
		}catch(IOException e){
			System.out.println("文件不存在");
		} finally{
			try {
				if (fw != null) {
					fw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

FileReader

       FileReader是與FileWriter 鎖對應的字符流讀取流,FileWriter 類中讀取的時候不需要刷新。

      FileWriter類在操作文件的時候文件必須存在,如果文件不存在則運行時報出:FileNotFindException異常。

     當讀取到文件末尾時,read()方法返回-1。

FileReader示例代碼:

package com.itheima.io.reader_writer;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


/**
 * 文件讀物
 * 其實在每一個文件的末尾處,都有一個結束標識。
 * @author wuyong
 *
 */
public class FileReaderDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String name = "D:\\IO\\ok.txt";//被讀取的文件
		FileReader fr = null;
		try {
			//創建一個讀取流對象
			fr = new FileReader(name);
			//創建一個緩衝區char[]數組chs,長度爲1024.
			char[] chs = new char[1024];
			//調用read方法讀取,read方法一次讀取一個字符,而且會自動往下讀取。
			int length = 0;
			
			StringBuilder sb = new StringBuilder();
			//如果沒有讀取到文件末尾,則繼續讀取。
			while ((length = fr.read(chs)) != -1) {
				System.out.println("length====" + length);
				//將緩衝區char[]數組chs保存到StringBuilder中
				sb.append(chs,0,length);
			}
			System.out.println(sb);//輸出文件內容
		} catch(IOException e){
			System.out.println("文件不存在!");
		} finally{
			try {
				if (fr != null) {
					fr.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

字符流複製文件:

package com.itheima.io.reader_writer;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 字符流複製文件
 * @author wuyong
 *
 */
public class CopyFileDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String src = "C://src.txt";//源文件
		String des = "D://des.txt";//目標文件
		FileWriter fw = null;
		FileReader fr = null;
		try {
			fw = new FileWriter(des);//字符輸出流
			fr = new FileReader(src);//字符輸入流
			//方式一:讀一個字符,寫入一個字符
//			int read = 0;
//			while ((read = fr.read()) != -1) {
//				fw.write(read);
//			}
			
			//方式二:定義一個數組緩衝區,每次讀取保存到數組中,在一次將數組中的讀取到的數據寫入目標文件。
			char[] chs = new char[1024];
			int length = 0;
			while ((length = fr.read(chs)) != -1) {
				fw.write(chs,0,length);
				fw.flush();
			}
			System.out.println("文件複製成功!");
		} catch (IOException e) {
			System.out.println("文件不存在!");
		} finally {//關閉流
			try {
				if (fw != null) {
					fw.close();
				}
				if (fr != null) {
					fr.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

字符流的緩衝區:

   緩衝區的出現可以提高對數據的讀寫效率。 原理,就是在內中封裝了數組。

  緩衝區要結合流纔可以使用,是在流的基礎上對流的功能進行的擴展。

   對應類:

1,BufferedWriter類是Writer的子類

  將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入。 

           可以指定緩衝區的大小,或者接受默認的大小。

  特有的方法:

void newLine(),另起一行,相當於換行回車符。

該方法可以實現跨平臺!因爲可以獲得不同平臺下的換行回車符。該方法是根據JDK安裝的版本來確定的。

BufferedWriter示例代碼:

package com.itheima.io.charstreambuffer;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;


/**
 * @author wuyong
 *
 */
public class BufferReaderDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String fileName = "D://Source.txt";//要讀取的文件
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(fileName));//字符讀取緩衝流對象
			while (br.read() != -1) {//這個判斷也可以。但建議用下面的方式。
				System.out.println(br.readLine());
			}
			while (br.readLine() != null) {//如果讀取到文件末尾,則readLine()方法返回null
				System.out.println(br.readLine());
			}
		} catch (IOException e) {
			System.out.println("文件不存在!");
		} finally {
			try {
				if (br != null) {
					br.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

2,BufferedReader類是Reader的子類

  從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。 

           可以指定緩衝區的大小,或者可使用默認的大小。

  特有的方法:String readLine(),一次讀取一行。

  無論是讀一行,獲取多個字符。其實最終都是在硬盤上一個一個讀取。所以最終使用的還是read方法一次讀一個的方法。

BufferedReader示例代碼:

package com.itheima.io.charstreambuffer;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;


/**
 * BufferWriter寫入緩衝類
 * @author wuyong
 *
 */
public class BufferWriterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String fileName = "D://Targets.txt";
		BufferedWriter bw = null;
		try {
			bw = new BufferedWriter(new FileWriter(fileName));
			bw.write("abc");
			bw.newLine();//換行
			bw.append("123sff");
			bw.flush();//緩衝區寫入時!一定要記住刷新!!!
			System.out.println("文件寫入成功!");
		} catch (IOException e) {
			System.out.println("文件不存在!");
		} finally{
			try {
				if (bw != null) {
					bw.close();//其實關閉緩衝區,就是在關閉緩衝區中的流對象!!!
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

字符緩衝流複製文件:

package com.itheima.io.charstreambuffer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


/**
 * 通過緩衝區複製文件
 * @author wuyong
 *
 */
public class BufferCopyDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		BufferedReader br = null;
		BufferedWriter bw = null;
		try {
			br = new BufferedReader(new FileReader("C:/src.txt"));
			bw = new BufferedWriter(new FileWriter("D:/bufferCopy.txt"));
			
			//方式一:定義一個數組作爲緩衝區,中轉站。
//			char[] chs = new char[1024];
//			int length = 0;
//			while ((length = br.read(chs)) != -1) {
//				bw.write(chs,0,length);
//			}
			//方式二:用readLine和newLine複製文件
			String str = null;
			while ((str = br.readLine()) != null) {
				bw.write(str);
				bw.newLine();
			}
			System.out.println("緩衝區複製文件成功!");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			try {
				if (br != null) {
					br.close();
				}
				if (bw != null) {
					bw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

3,LineNumberReader

      int getLineNumber() 獲得當前行號。默認從0開始。

      void setLineNumber() 設置當前行號。

LineNumberReader示例代碼:

package com.itheima.io.charstreambuffer;

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

/**
 * LineNumberReader,帶行號讀取文本文件
 * @author wuyong
 *
 */
public class LineNumberReaderDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			LineNumberReader lineNumber = new LineNumberReader(new FileReader("C:\\src.txt"));
			String line = null;
			while ((line = lineNumber.readLine()) != null) {
				System.out.println(lineNumber.getLineNumber() + " : " + line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

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