zoukankan      html  css  js  c++  java
  • javaIo总结

    JavaIO总结

    版本

    修改内容

    日期

    修改人

    V1.0

    原始版本

    2013-02-24

    skywang

    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

    FileReader

    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 IO系统分为基本类和装饰器,是因为基本类主要是将流分为文件、字符串等不同种类,而装饰器是为了实现“Decorator模式”(参考 “4 Decorator模式”)。

    3 Java 1.0 IO系统介绍

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

    3.1输入流

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

    (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。它的主要功能在于动态扩展一个类的功能。

    JavaIO系统包括“文件流”、“字符串流”、“字节流”、“缓冲流”等。假如,我们同时需要多种数据流的功能,如输入流和缓冲流。若采用继承的 方式,数量太可观了。为了解决这一问题,Decorator模式实现了动态扩展,即在运行的时候动态的给一个类“装饰”上某些功能。比如:

    InputStream input = newBufferedInputStream(new FileInputStream(“test.txt”));

    这就是将FileInputStream装饰成了BufferedInputStream,使它具有了缓冲功能。

    5 例子

    package com.skywang;

    import java.io.*;

    public class IOTest{

        publicstatic voidmain(String[] args) throwsIOException {

           try {

                File f=newFile("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.close();

           }catch (FileNotFoundException e){

               e.printStackTrace();

           }catch (SecurityException e){

               e.printStackTrace();

           }

        }

    }

    参考文献:

    1,JAVA API文档

    2,《Thinking In Java》

    3,百度百科:http://baike.baidu.com/view/5020798.htm

    4,java中的io系统详解:http://blog.csdn.net/ilibaba/article/details/3955799

    5,java中的IO整理(非常多的实例):http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html

    6,深入Java 的IO 体系 - Decorator 模式的应用:http://www.doc88.com/p-817688448986.html

    7,BufferedInputStream实现原理分析:http://www.software8.co/wzjs/java/1770.html

  • 相关阅读:
    在 Windows 上测试 Redis Cluster的集群填坑笔记
    vmware安装黑苹果教程
    微信支付v3发布到iis时的证书问题
    Linux下安装SQL Server 2016(连接篇SQL Server on linux)
    Linux下安装SQL Server 2016(连接篇SQL Server on linux)
    Linux下安装SQL Server 2016(安装篇SQL Server on linux)
    Linux下安装SQL Server 2016(准备篇SQL Server on linux)
    客服端与服务端APP支付宝支付接口联调的那些坑
    ASP.NET MVC]WebAPI应用支持HTTPS的经验总结
    .net平台下C#socket通信(中)
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/3844080.html
Copyright © 2011-2022 走看看