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");
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值