javaIo总结

简介: JavaIO总结     版本 修改内容 日期 修改人 V1.0 原始版本 2013-02-24 skywang             1 Java IO版本 Java库的IO分为输入/输出两部分。

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

相关文章
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
21天前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
40 9
|
5月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
88 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
39 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
97 1
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
237 12
|
2月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
63 0
|
2月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
39 0