Java中IO流缓冲区的装饰模式的体现

简介:

一、Java中IO流缓冲区

import java.io.*;
public class BufferedTest
{
public static void copy1()
{
 InputStream is = null;
 OutputStream os = null;
 try
 {
  is = new FileInputStream("c:\\xy1.jpg");
  os = new FileOutputStream("d:\\xy2.jpg");
  int len = 0;
  byte[] buffer = new byte[1024];
  while ((len = is.read(buffer)) != -1)
  {
   os.write(buffer, 0, len);
  }
 }
 catch (IOException ex)
 {
  throw new RuntimeException("文件操作出错");
 }
 finally
 {
  try
  {
   if (null != is)
   {
    is.close();
   }
  }
  catch (IOException ex)
  {
   throw new RuntimeException("输入流关闭出错");
  }

  try
  {
   if (null != os)
   {
    os.close();
   }
  }
  catch (IOException ex)
  {
   throw new RuntimeException("输出流关闭出错");
  }
 }
}

public static void copy2()
{
 InputStream is = null;
 BufferedInputStream bis = null;
 OutputStream os = null;
 BufferedOutputStream bos = null;
 try
 {
  is = new FileInputStream("c:\\xy1.jpg");
  bis = new BufferedInputStream(is);
  os = new FileOutputStream("d:\\xy2.jpg");
  bos = new BufferedOutputStream(os);
  int len = 0;
  byte[] buffer = new byte[1024];
  while ((len = bis.read(buffer)) != -1)
  {
   bos.write(buffer, 0, len);
  }
 }
 catch (IOException ex)
 {
  throw new RuntimeException("文件操作出错");
 }
 finally
 {
  try
  {
   if (null != bis)
   {
    bis.close();
   }
  }
  catch (IOException ex)
  {
   throw new RuntimeException("输入流关闭出错");
  }

  try
  {
   if (null != bos)
   {
    bos.close();
   }
  }
  catch (IOException ex)
  {
   throw new RuntimeException("输出流关闭出错");
  }
 }
}
}
copy1方法是普通的利用字节流读写文件的例子。JDK提供了流的缓冲区的概念用来提高读写效率,在copy2中可以提现。利用了设计模式的装饰模式的概念。


二、利用装饰模式自定义读取行方法

字符流的缓冲区BufferedReader提供了一个读取行的方法,可以一次读取文本文件的一行。利用装饰模式自己实现一个读取行的方法。
public class MyReadLine
{
private Reader reader;

public MyReadLine(Reader reader)
{
 super();
 this.reader = reader;
}

public String myReadLine() throws IOException
{
 // 字符缓冲区
 StringBuilder sbuilder = new StringBuilder();
 // 单个字符的ASCII码值
 int len = 0;
 // 未读到文件的末尾
 while ((len = reader.read()) != -1)
 {
  // windows中换行符是\r\n
  if (len == '\r') continue;
  if (len == '\n')
  {
   // 读取完了一行,返回该行内容
   return sbuilder.toString();
  }
  else
  {
   // 将读到的有效字符存入缓冲区
   sbuilder.append((char) len);
  }
 }
 // 最后一行可能没有换行符,若判断出现换行符再返回值就读取不到最后一行。所以判断缓冲区内是否有值,若有值就返回。
 if (sbuilder.length() != 0)
 {
  return sbuilder.toString();
 }
 return null;
}

public void myclose() throws IOException
{
 reader.close();
}

public Reader getReader()
{
 return reader;
}

public void setReader(Reader reader)
{
 this.reader = reader;
}
}

public class MyReadLineTest
{
public static void main(String[] args)
{
 MyReadLine myReader = null;
 try
 {
  StringBuilder sbresult = new StringBuilder();
  myReader = new MyReadLine(new FileReader("c:\\aaa.txt"));
  String line = null;
  while ((line = myReader.myReadLine()) != null)
  {
   sbresult.append(line);
  }
  System.out.println(sbresult.toString());
 }
 catch (IOException e)
 {
  throw new RuntimeException("读取文件异常");
 }
 finally
 {
  try
  {
   if (null != myReader)
   {
    myReader.myclose();
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException("关闭失败");
  }
 }
}
}

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1390743如需转载请自行联系原作者


woshixuye111


相关文章
|
28天前
|
存储 缓存 安全
Java 中 IO 流、File文件
Java 中 IO 流、File文件
|
11天前
|
Java Unix Windows
|
5天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
13 1
|
6天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
17 2
|
7天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
8天前
|
存储 Java 测试技术
Java基础IO总结(下)
Java基础IO总结(下)
14 0
|
8天前
|
存储 Java
Java基础IO总结(上)
Java基础IO总结(上)
15 0
|
12天前
|
存储 Java 数据库
[Java 基础面试题] IO相关
[Java 基础面试题] IO相关
|
13天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
15 1
|
16天前
|
Java
Java基础教程(12)-Java中的IO流
【4月更文挑战第12天】Java IO涉及输入输出,包括从外部读取数据到内存(如文件、网络)和从内存输出到外部。流是信息传输的抽象,分为字节流和字符流。字节流处理二进制数据,如InputStream和OutputStream,而字符流处理Unicode字符,如Reader和Writer。File对象用于文件和目录操作,Path对象简化了路径处理。ZipInputStream和ZipOutputStream则用于读写zip文件。