黑马程序员---Java基础学习笔记(IO-后篇)

------------Android培训 、Java培训、期待与您交流----------

1.流数据缓冲区

  缓冲区的出现提高了对数据的读写效率
  对应类:BufferedWriter BufferedReader
  缓冲区要结合流才可以使用。在流的基础上对流的功能进行了增强。
  所以在建立缓冲区之前,必须要先有流对象
import java.io.*;

public class BufferZone 
{
	public static void main(String[] args) throws IOException 
	{
		/*
		FileWriter fw = new FileWriter("iojavao2.txt" , true);
		BufferedWriter bufw = new BufferedWriter(fw);
		for(int i = 0 ; i < 5 ; i++)
		{
			bufw.write("abcdefg");
			bufw.newLine();//可以跨平台相当于bufw.write("\r\n");
			bufw.flush();
		}
		//只要用到缓冲区,就要记得刷新。
		//bufw.flush();
		
		bufw.close();//其实关闭缓冲区就是关闭缓冲区中的流对象
		*/
		/*
		FileReader fr = new FileReader("iojavao2.txt");
		BufferedReader bufr = new BufferedReader(fr);
		String str = null;
		while((str = bufr.readLine())!=null)
		//String s1 = bufr.readLine();
		{
			System.out.println(str);
		}
		bufr.close();
		*/
		/*
		//复制文件
		BufferedReader bufr = null;
		BufferedWriter bufw = null;
		try
		{
			bufr = new BufferedReader(new FileReader("IOTest.java"));
			bufw = new BufferedWriter(new FileWriter("iojava03.txt"));
			String line = null;
			while((line = bufr.readLine())!=null)//readLine()并不返回行行终止符
			{
				bufw.write(line);
				bufw.newLine();
				bufw.flush();
			}
		} 
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try {
				bufr.close();
			} catch (IOException e) {
				// TODO: handle exception
			}
			try {
				bufw.close();
			} catch (IOException e) {
				// TODO: handle exception
			}
		}
		*/
		
		//LineNumberReader装饰类
		FileReader fr = new FileReader("IOTest.java");
		LineNumberReader lm = new LineNumberReader(fr);
		String str = null;
		//lm.setLineNumber(100);
		while((str = lm.readLine())!=null)
		{
			System.out.println(lm.getLineNumber()+":"+str);
		}
		lm.close();
	}
}
2.模拟实现readLine()方法

装饰设计模式:当想要对已有的对象进行功能增强时,可以将该对象定义一个类,将已有
  对象传入,基于已有对象的功能,提供加强功能的一种自定义的类
  装饰类通常会通过构造方法接受被装饰的对象,并基于被装饰的对象的功能提供更强的功能
装饰和继承的区别?
 装饰模式比继承要灵活,避免了继承体系的臃肿,从而降低了类与类之间的关系
 装饰类和被装饰类通常都属于一个体系中
import java.io.*;

public class DIYReadLine 
{
	public static void main(String[] args) throws IOException 
	{
		FileReader fr = new FileReader("IOTest.java");
		DIYBufferedReader dr = new DIYBufferedReader(fr);
		String line = null;
		while((line = dr.DIYReadLine()) != null)
		{
			System.out.println(line);
		}
		dr.DIYClose();
	}
}

class DIYBufferedReader //extends Reader
{
	private FileReader r;
	DIYBufferedReader(FileReader r)
	{
		this.r = r;
	}
	//以下为对象增强的功能 DIYReadLine() DIYClose()
	public String DIYReadLine() throws IOException
	{
		//定义一个临时容器,原BufferedReader封装的是字符数组
		StringBuilder sbr = new StringBuilder();
		int ch = 0;
		while((ch = r.read())!=-1)
		{
			if(ch == '\r')
				continue;
			else if(ch == '\n')
				return sbr.toString();
			else
			{
				sbr.append((char)ch);
			}
		}
		//以防文件末尾并没有回车符从而导致最后一行数据没有被打印出来
		if(sbr.length()!=0)
			return sbr.toString();
		return null;
	}
	public void DIYClose() throws IOException
	{
		r.close();
	}
	
	/*
	 * 如果让该类变为继承Reader类的话,因为Reader类中有抽象方法,所以要进行覆写方法
	 * 否则会编译失败,这就是用继承的不方便
	 * public void close()
	 * {
	 * 		r.close();
	 * }
	 * public void read(char[] cbuf , int off , int len)
	 * {
	 * 		return r.read(cbuf , off , len);
	 * }
	 */
	
}
------------Android培训 、Java培训、期待与您交流----------

你可能感兴趣的:(Java代码)