1. 程式人生 > >Java——IO流(三)字元流的讀寫與拷貝、裝飾設計模式

Java——IO流(三)字元流的讀寫與拷貝、裝飾設計模式

1.字元流的學習(FileReader與FileWriter):字元流是可以直接讀寫字元的IO流(只讀或者只寫時使用字元流)          (1)字元流讀取字元就要先讀取到位元組資料,然後轉化為字元;如果要寫出字元,需要把字元轉化為位元組再寫出          (2)讀取的時候是按照字元的大小讀取的,不會出現半個中文;寫出的時候,直接將字串寫出,沒有轉換動作          (3)字元流不可以拷貝非純文字檔案          (4)流物件儘量晚開早關               2.字元流常見的讀寫      3.字元流的拷貝      4.自定義字元陣列的拷貝      5.帶緩衝的字元流的拷貝      6.使用緩衝的字元流readLine()方法(返回的是String)和newLine()方法拷貝

           7.將文字反轉(將一個文字文件的第一行和倒數第一行交換,以此類推)            8.LineNumberReader,是BufferedReader的子類,具有相同的功能,並且可以統計行號          (1)setLineNumber(int)設定行號          (2)getLineNumber()獲得行號            9.如何使用指定的碼錶讀寫字元(對不同的碼錶進行處理的步驟)          (1)InputStreamReader和OutputStreamWriter是位元組流通向字元流的橋樑            10.裝飾設計模式
(這樣子處理,耦合性沒有那麼強)          (1)獲取被裝飾的類引用          (2)構造方法中傳入物件          (3)對原有功能進行升級

package pra_17;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class J_34 {
	public static void main(String[] args) throws IOException {
		//1.常見的讀寫
		FileReader fr=new FileReader("aaa.txt");
		FileWriter fw=new FileWriter("bbb.txt",true);	//往裡寫不清空
		int x;
		while((x=fr.read())!=-1){
			System.out.println((char)x);
		}
		fw.write("你不是一個大帥哥!");		//無論是讀出來還是寫出去,都是使用預設的碼錶實現
		fr.close();
		fw.close();
		
		//2.字元流的拷貝
		FileReader fr1=new FileReader("aaa.txt");
		FileWriter fw1=new FileWriter("zzz.txt");
		int y;
		while((y=fr1.read())!=-1){
			fw1.write(y);
		}
		fr1.close();
		fw1.close();	//Writer類中有一個2k的小緩衝區,關流才會將字元寫出後才關閉流
		
		//3.自定義字元陣列的拷貝
		FileReader fr2=new FileReader("aaa.txt");
		FileWriter fw2=new FileWriter("yyy.txt");
		char[] arr=new char[1024];
		int len;
		while((len=fr2.read(arr))!=-1){
			fw2.write(arr,0,len);
		}
		fr2.close();
		fw2.close();
		
		//4.帶緩衝的字元流的拷貝
		BufferedReader br=new BufferedReader(new FileReader("aaa.txt"));
		BufferedWriter bw=new BufferedWriter(new FileWriter("xxx.txt"));
		int c;
		while((c=br.read())!=-1){	//直接將緩衝區的內容讀入
			bw.write(c);
		}
		br.close();
		bw.close();
		
		//5.使用緩衝的字元流readLine()方法(返回的是String)和newLine()方法拷貝
		BufferedReader br2=new BufferedReader(new FileReader("aaa.txt"));
		BufferedWriter bw2=new BufferedWriter(new FileWriter("qqq.txt"));
		String line;
		while((line=br2.readLine())!=null){
			bw2.write(line);
			bw2.newLine();		//寫出回車換行符,與"\r\n"的區別在於newLine()是跨平臺的方法。
		}
		br2.close();
		bw2.close();
		
		//6.將文字反轉
		BufferedReader br3=new BufferedReader(new FileReader("aaa.txt"));
		BufferedWriter bw3=new BufferedWriter(new FileWriter("abccba.txt"));
		ArrayList<String> list=new ArrayList<>();
		String line2;
		while((line2=br3.readLine())!=null){
			list.add(line2);
		}
		for (int i=list.size()-1;i>=0;i--) {
			bw3.write(list.get(i));
			bw3.newLine();
		}
		br3.close();
		bw3.close();
		
		//7.LineNumberReader具有相同的功能,並且可以統計行號
		LineNumberReader lnr=new LineNumberReader(new FileReader("aaa.txt"));
		String line3;
		lnr.setLineNumber(0);	//從第0+1行開始
		while((line3=lnr.readLine())!=null){
			System.out.println(lnr.getLineNumber());
		}
		
		//8.使用指定的碼錶讀寫字元
		//FileReader fr3=new FileReader("utf8.txt");	//用預設編碼表讀取檔案
		//FileWriter fw3=new FileWriter("gbk.txt");		//用預設編碼表寫出檔案
		
			//使用指定的utf-8碼錶
		InputStreamReader isr=new InputStreamReader(new FileInputStream("utf8.txt"),"utf-8");//指定碼錶讀取字元	
		OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk");//指定碼錶寫入字元
		int c2;
		while((c2=isr.read())!=-1){
			osw.write(c2);
		}
		isr.close();
		osw.close();
		
			//相比上面一個,更高效的讀寫
		BufferedReader br4=new BufferedReader(new InputStreamReader(new FileInputStream("utf8.txt"),"utf-8"));
		BufferedWriter bw4=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk2.txt"),"gbk"));
		int c3;
		while((c3=br4.read())!=-1){
			bw4.write(c3);
		}
		br4.close();
		bw4.close();
	}
}

裝飾設計模式的例子

package pra_17;
public class J_35 {
	public static void main(String[] args) {
		Fac fac=new Fac(new Tag());
		fac.ck();
	}
}
interface Ck{
	public void ck(); 
}
class Tag implements Ck{
	@Override
	public void ck() {
		System.out.println("this is ck");
		System.out.println("this is ck2");
	}
}
class Fac implements Ck{
	private Ck ck;			//獲取被裝飾類Ck的引用
	public Fac(Ck ck){		//構造方法中傳入物件
		this.ck=ck;
	}
	@Override
	public void ck() {		//對原有功能進行升級
		ck.ck();
		System.out.println("this is ck3");
		System.out.println("this is ck4");
	}
	
}