`
Yinny
  • 浏览: 295837 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
我将按照基类的顺序:InputStream、OutPutStream、Reader、Writer来分别对Java I/O加以总结。

。。。。。整理中



java中的流,简单理解就是管道里有流水,这个管道连接了程序和文件。
InputStream、OutPutStream是字节输入流的所有类的超类。
Reader、Writer是字符输入流的所有类的超类。


Java IO流对象(其实大家都和懂啦,我这里再赘述一下)
1.输入字节流InputStreamIO 中输入字节流的继承图可见上图,可以看出:
InputStream 是所有的输入字节流的父类,它是一个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据。
ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。

2.输出字节流OutputStream
IO 中输出字节流的继承图可见上图,可以看出:
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,
ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。


 Decorator模式又名包装器(Wrapper),它的主要用途在于给一个对象动态的添加一些额外的职责。与生成子类相比,它更具有灵活性。用我的理解就是当流经过输入输出的管道时候给它添加一些额外的功能。(装饰模式和继承有什么区别呢?这个后续讨论)下面的图来自《Head first design patterns》中装饰者模式一章


Component为组件和装饰的公共父类,它定义了子类必须实现的方法。

  ConcreteComponent是一个具体的组件类,可以通过给它添加装饰来增加新的功能。

  Decorator是所有装饰的公共父类,它定义了所有装饰必须实现的方法,同时,它还保存了一个对于Component的引用,以便将用户的请求转发给Component,并可能在转发请求前后执行一些附加的动作。

  ConcreteDecoratorA和ConcreteDecoratorB是具体的装饰,可以使用它们来装饰具体的Component.

众人皆知java的输入输出包"java.io"是一个装饰者模式的典型案例,这从下面这小段代码就可以大致看出:
	BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("d:tina.txt"));

我使用了一个BufferedOutputStream封装了一个FileOutputStream,FileOutputStream相当于一个Component,BufferedOutputStream就是一个Decorator。


说的通俗一点,装饰者模式就是需要添加一个新功能就包一层,同时需要另外一个新功能就再包一层。基本的原理是这样的:如果需要对A类装饰,就从A类的父类继承一个装饰者虚拟类(当然也可以用接口,可能接口更理想),然后从这个虚拟类(接口)实现具体的装饰者类,在具体装饰者类中从构造函数引入被包装者对象,然后对该对象添加额外的功能。(The decorator adds its own behavior either before and/or after delegating to the object itdecorates to do the rest of the job.) 这样很容易就扩展了被包装类的功能,也没有修改被包装类和他的父类。

上面的图告诉我们,所有的类都是用来包装inputStream的,输出流outputStream的设计方式也是一样的,搞清楚这点,我们就不会再为io里面数量繁多的类而感到头痛了!

/**
 * @author tina.wyn
 * 
 */
class MyInputStream extends FilterInputStream {

	protected MyInputStream(InputStream in) {
		super(in);
	}

	public int read() throws IOException {
		int c = super.read();
		return (c == -1 ? c : Character.toLowerCase((char) c));

	}
	
	public int read(byte[] b, int offset,int len)throws IOException{
		
		int result = super.read(b, offset, len);
		for(int i = offset;i<offset+result;i++){
			b[i] = (byte) Character.toLowerCase((char)b[i]);
		}
		return result;
		
	}
	

}

public class InputTest{
	
	public static void main(String[] args) throws IOException{
		int c;
		try {
			InputStream in = new MyInputStream(new BufferedInputStream(new FileInputStream("d:/tina.txt")));
			while ((c = in.read())!=-1) {
				System.out.print((char)c);
			}
			in.close();
		} catch (IOException e) {
		}
		
	}
	
}


在所有的流操作里。字节永远是最基础的。任何基于字节的操作都是正确的。无论你是文本文件还是二进制的文件。

如果确认流里面只有可打印的字符,包括英文的和各种国家的文字,也包括中文,那么可以考虑用字符流。

由于编码不同,多字节的字符可能占用多个字节。比如GBK的汉字就占用2个字节,而UTF-8的汉字就占用3个字节。

所以,字符流是根据指定的编码,将1个或多个字节转化为java里面的unicode的字符,然后进行操作。

字符操作一般使用Writer,Reader等, 字节操作一般都是InputStream, OutputStream 以及各种包装类,比如BufferedInputStream和BufferedOutputStream等。
分享到:
评论
1 楼 airhot 2012-06-23  
拜读一下42次浏览的文章

相关推荐

    java.io包讲解

    通过对Java.io包的学习,我们可以了解到Java如何处理复杂的输入输出操作。通过合理的使用各种流类,开发者可以高效地完成文件的读写任务,同时也能够更好地管理资源,避免内存泄漏等问题的发生。在实际开发中,理解...

    java_IO.rar

    10. **总结(10_总结.avi)**:最后的视频是对整个IO系列的回顾,总结关键知识点,帮助巩固学习成果。 通过这个教程,开发者不仅可以理解Java IO的基本概念,还能学习到如何在实际项目中高效地使用IO流进行数据交换...

    用java.util.zip包现数据压缩与解压

    通过本文的学习,您应该已经了解了如何使用 Java 中的 `java.util.zip` 包来进行数据的压缩与解压操作。无论是对于 ZIP 文件还是 GZIP 文件,该包都提供了强大的支持。在实际开发过程中,合理利用这些工具可以帮助您...

    JAVA_IO流学习总结

    JAVA_IO流学习总结

    java io包课件

    总结起来,Java的`java.io`包提供了一整套工具,使开发者能够方便地处理文件操作和数据流。理解并熟练掌握这些类和方法,对于任何Java开发者来说都是至关重要的,因为它们是进行文件处理和数据交换的基础。通过学习...

    RabbitMq+springboot

    总结来说,"RabbitMq+springboot"的示例项目涵盖了RabbitMQ的三种主要工作模式,消息确认机制,消息重发机制,以及如何在SpringBoot应用中使用这些特性。对于开发者而言,这个项目提供了一个实用的学习资源,帮助...

    java.util.logging.Logger使用详解

    ### Java.util.logging.Logger 使用详解 #### 一、创建Logger对象 在Java中,`java.util.logging.Logger` 是...通过本文的学习,开发者能够更好地掌握 `java.util.logging` 框架的核心概念,并在实际项目中灵活运用。

    java jdk io包类详解

    通过对`java.io`包中的类和接口的学习,我们不仅能够深入了解Java中基础输入输出流的实现原理,还能够掌握如何高效地处理文件和其他数据流。这对于日常的软件开发工作是非常有用的。此外,通过理解装饰者模式的应用...

    《JAVA_IO流学习总结》

    总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...

    java keytool安全证书学习

    总结起来,Java Keytool是Java安全体系中的一个重要工具,它在JSSE框架下用于创建和管理KeyStore和TrustStore,以支持SSL/TLS协议的安全通信。通过理解Keytool的使用方法和原理,开发者可以有效地保障网络通信的安全...

    javaio流学习总结.pdf

    javaio流学习总结.pdf

    JAVA-IO流学习总结.docx

    JAVA-IO流学习总结.docx

    Java之IO流学习总结.pdf

    在这份《Java之IO流学习总结》文档中,我们可以了解到IO流的不同使用场景和基本的编程操作。 首先,我们来认识IO流中的基本类。在Java中,所有与IO相关的类都位于java.io包中。主要的抽象基类有InputStream、...

    dubbo.io文档

    总结来说,这三本书籍构成的《Dubbo.IO 文档》是一份全面的Dubbo学习资源,无论是初学者还是经验丰富的开发者,都能从中受益。通过阅读`dubbo-user-book`,你可以掌握基础的Dubbo使用方法;通过`dubbo-dev-book`,你...

    Java IO学习总结归纳(附代码)

    以下是对Java IO的详细学习总结: ### 1. IO流概述 IO流是Java中处理输入输出的核心概念。它们可以被视为数据传输的管道,允许数据在源和目的地之间流动。Java将所有IO操作封装为流对象,分为四大类:字节流(Byte ...

    Java学习之IO总结及mina和netty

    这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...

    JAVAIO流学习总结(转)

    这是别人总结的很有实用价值的javaIO流教程。

Global site tag (gtag.js) - Google Analytics