Java——IO流(三)字元流的讀寫與拷貝、裝飾設計模式
阿新 • • 發佈:2018-12-14
1.字元流的學習(FileReader與FileWriter):字元流是可以直接讀寫字元的IO流(只讀或者只寫時使用字元流) (1)字元流讀取字元就要先讀取到位元組資料,然後轉化為字元;如果要寫出字元,需要把字元轉化為位元組再寫出 (2)讀取的時候是按照字元的大小讀取的,不會出現半個中文;寫出的時候,直接將字串寫出,沒有轉換動作 (3)字元流不可以拷貝非純文字檔案 (4)流物件儘量晚開早關 2.字元流常見的讀寫 3.字元流的拷貝 4.自定義字元陣列的拷貝 5.帶緩衝的字元流的拷貝 6.使用緩衝的字元流readLine()方法(返回的是String)和newLine()方法拷貝
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");
}
}