设计模式学习笔记--设计模式在Java I/O中的应用(装饰模式和适配器模式)(二)

2014-11-23 23:31:15 · 作者: · 浏览: 2
eam是一个适配器类:\


OutputStream原始流处理器中的适配器模式


ByteArrayOutputStream是一个适配器类:\


FileOutputStream是一个适配器类:\


PipedOutputStream是一个适配器类:\


Reader原始流处理器中的适配器模式


CharArrayReader是一个适配器类:\


StringReader是一个适配器类:\


其他,关于InputStreamReader,PipedReader等也都是适配器类。


Writer类型中的适配器模式


CharArrayWriter是一个适配器类:\


PipedWriter是一个适配器类:\


StringWriter是一个适配器类:\


Java I/O 代码示例


缓冲输入文件


如果想要打开一个文件用于字符输入,可以使用FileReader。为了提供速度,我们可能希望对那个文件进行缓冲,那么我们将所产生的引用传递给一个BufferedReader对象。

代码示例(BufferedInputFile.java)如下:

//缓冲输入文件
import java.io.*;
class BufferedInputFile
{
	public static String read(String filename) throws IOException
	{
		//Reading input by lines
		BufferedReader in = new BufferedReader(new FileReader(filename));
		String s;
		StringBuilder sb = new StringBuilder(); //注意这里使用的StringBuilder是JDK5.0引入的,它和StringBuffer的唯一区别是它不是线程安全的,因而性能更高
		while((s = in.readLine()) != null)
		{
			sb.append(s + "\n");
		}
		in.close();
		return sb.toString();

	}
	public static void main(String[] args) throws IOException
	{
		System.out.println(read("BufferedInputFile.java"));
	}
}

从内存输入内容


使用StringReader读取字符,或者使用DataInputStream读取字节。代码如下:

//从内存输入:使用StringReader,无中文乱码问题
import java.io.*;
class MemoryInput
{
	public static void main(String[] args) throws IOException
	{
		StringReader in = new StringReader(BufferedInputFile.read("MemoryInput.java"));
		int c;
		while((c = in.read()) != -1)
		{
			System.out.print((char)c);
		}
	}
}
//从内存输入;使用DataInputStream,这是一个面向字节的I/O类(不是面向字符的),有中文乱码问题
class FormattedMemoryInput
{
	public static void main(String[] args) throws IOException
	{
		try
		{
			DataInputStream in = new DataInputStream(new ByteArrayInputStream(BufferedInputFile.read("MemoryInput.java").getBytes()));
			while(true)
			{
				System.out.print((char)in.readByte());
			}			
		}
		catch (EOFException e)
		{
			System.err.println("End Of Stream");
		}

	}
}

//从内存输入;判断文件结尾
class TestEOF
{
	public static void main(String[] args) throws IOException
	{
		DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("MemoryInput.java")));
		while(in.available() != 0)
		{
			System.out.print((char)in.readByte());
		}
	}
}

基本的文件输出


FileWriter对象可以向文件写入数据。通常会 用BufferedWriter将其包装起来 用以缓冲输出(缓冲往往能显著地增加I/O操作的性能)。在本例中,为了提供格式化机制,它被装饰成PrintWriter。安装这种方式创建的数据可作为普通文本读取。代码如下:

//基本的文件输出
import java.io.*;
class BasicFileOutput
{
	public static void main(String[] args) throws IOException
	{
		BufferedReader in = new BufferedReader(new StringReader(BufferedInputFile.read("BasicFileOutput.java")));
		//PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("BasicFileOutput.out")));
		//也可以使用简化的方式,依旧是在进程缓存,而不必自己去实现。遗憾的是,其他常见的写入任务都没有快捷方式
		//因此,典型的I/O人就包含大量的冗余文本
		PrintWriter out = new PrintWriter("BasicFileOutput.out");
		int lineCount = 1;
		String s;
		while((s = in.readLine()) != null)
		{
			out.println(lineCount++ + ": " + s);
		}
		out.close();
		//Show the stored file:
		System.out.println(BufferedInputFile.read("BasicFileOutput.out"));
	}
}

存储和恢复数据


PrintWriter可以对数据进行格式化,以便人们的阅读。如果为了输出可供另一个”流“恢复的数据,则需要用DataOutputStream写入数据,并用DataInputStream恢复数据。当然,这些流可以是任何形式,但在下面的示例中使用的是一个文件,并且对于读写都进行了缓冲处理。代码如下:

//存储和恢复