JavaIO总结

本文摘抄至 : skywang12345

摘要 : 介绍了流的大致分类。和Decora(装饰器)的作用和其相关链接

1 Java Io版本


Java库的IO分为 输入/输出两个部分。

早期的Java 1.0版本输入系统是InputStream及其子类,输出系统是OutputStream及其子类。

后来的 Java 1.1版本对IO系统进行了重新设计。输入系统是Reader及其子类,输出系统是Writer及其子类。

Java1.1之所以要重新设计,主要是为了添加国际化支持(即添加了对16位Unicode码的支持)。具体表现为Java 1.0的IO系统是字节流,而Java 1.1的IO系统是字符流。

字节流,就是数据流中最小的数据单元是 8 位字节。
字符流,就是数据流中最小的数据单元是 16 位字符。

字节流在操作的时候,不会用到缓冲;而字符流会用到缓冲。所以,字符流的效率会更高一些。

至于为什么用到缓冲会效率更高一些呢 ? 那是因为,缓存本质上是一段内存区域;而文件大多是存储在硬盘或者 Nand Flash上面。读写内存的速度比读写硬盘活或Nand Flash上文件的速度快很多 !

目前,文件大多以字节的方式存储的。所以在开发中,字节流使用较为广泛。

2 Java 1.0和Java 1.1 的IO类的比较


表01_Java 1.0和Java 1.1的IO基本类对比表

Java 1.0 IO基本类(字节流) Java 1.1 IO基本类(字符流)
InputStream Reader
OutputStream Writer
FileInputStream FileWriter
FileOutputStream FileWriter
StringBufferInputStream StringReader
StringWriter
ByteArrayInputStream CharArrayReader
ByteArrayOutputStream CharArrayWriter
PipedInputStream PipedReader
PipedOutputStream PipedWriter





表02_Java 1.0和Java 1.1的IO装饰器对比表

Java 1.0 IO装饰器(字节流)Java 1.1 IO装饰器(字符流)
FilterInputStream FilterReader
FilterOutputStream FilterWriter(没有子类的抽象类)
BufferedInputStream BufferedReader(也有 readLine())
BufferedOutputStream BufferedWriter
DataInputStream
PrintStream PrintWriter
LineNumberInputStream LineNumberReader
StreamTokenizer
PushBackInputStream PushBackReader

之所以将 Java 1.0系统分为基本类和装饰器,是因为基本类主要是将流分为文件、字符串等不同种类。二装饰器是为了实现 Decorator模式

3 Java 1.0 IO系统介绍


因为Java 1.0与Java 1.1的IO系统的原理和使用方法都相似。所以,下面主要对Java 1.0的IO系统进行说明。

3.1 输入流

InputSteam是字节输入流的所有的超类,它主要包括以下几个常用的子类 :

(01)ByteArrayInputStream
将Byte数组作为字节数组输入流使用。

(02)StringBufferInputStream
将字符串作为字符串输入流使用。已过时,不建议使用

(03)FileInputStream
将文件或 FileDescriptor作为文件输入流使用。创建该输入流时,传递的参数可以是“文件名”(String类型)、“File对象”或“FileDescriptor对象”(即可以是标准输入流、输出流、错误流的句柄)。

(04)PipedInputString
提供要写入管道输出流的所有数据字节。创建该输入流的时候,可以指定对应的管道输出轮流;这样做的话,意味着将对应的管道输入流连接到了管道输出流。

(05)FilterInputStream
它直接继承与InputStream,主要用于实现Decorator模式(这在后面进行说明)。
FilterInputStream主要有两个派生类“DataInputStream”和“BufferedInputStream”。DataInputStream提供了读取byte、char、int等基本类型和String的各种接口;BufferedInputStream提供了缓冲功能。

3.2输出流

OutputStream是字节输出流的所有类的超类,它主要包括以下几个常用的子类。

(01)ByteArrayOutputStream
字节数组输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。

(02)FileOutputStream
文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。

文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。

(03)PipedOutputString
可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream读取。

不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于 毁坏 状态。

(04)FilterOutputStream
它直接继承与OutputStream,主要用于实现Decorator模式(这在后面进行说明)。

FilterOutputStream主要有两个派生类“DataOutputStream”和“BufferedOutputStream”。DataOutputStream提供了写入byte、char、int等基本类型和String的各种接口;BufferedOutputStream提供了缓冲功

4 Decorator模式


Decorator,装饰模式,又称为 Wrapper。它的主要功能在于动态扩展一个类的功能。

Java IO 系统包括“文件流”、“字符串流”、“字节流”、“缓存流”等。假如,我们同时需要多种数据流的功能,如输入流和缓存流。若是用继承的方式,数量太客观了,为解决这一问题,Decorator模式实现了动态的扩展。即在运行的时候动态的给一个类“装饰”装饰上某些功能。比如:
InputStream in = new BufferedInputStream(new FileInputStream(“test.txt”));
这就是将FileInputStream装饰成了BufferedInputStream,使它具有了缓存功能。

5 例子


public class IOTest {

    public static void main(String[] args) {

        try {
              File f=new File("d:123.txt");
            OutputStream out = new BufferedOutputStream(
                    new FileOutputStream(f));

              String str="helloskywang!";

              byte[] b = str.getBytes();
              for (int i = 0; i < b.length; i++) {
                out.write(b[i]);
            }
              out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

参考文献:

百度百科
java中的IO整理(非常多的实例)
深入Java 的IO 体系 - Decorator 模式的应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值