博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习之i/o系统
阅读量:4316 次
发布时间:2019-06-06

本文共 2777 字,大约阅读时间需要 9 分钟。

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提供了缓冲功能。

 

转载于:https://www.cnblogs.com/poorapple/p/7164725.html

你可能感兴趣的文章
Delphi消息小记
查看>>
HNOI2016
查看>>
BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
查看>>
JVM介绍
查看>>
结构体,联合体,内存分配
查看>>
JVM垃圾收集器介绍
查看>>
[No0000136]6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
查看>>
【转】MapReduce源码分析总结
查看>>
原生JDK网络编程- NIO之Reactor模式
查看>>
table01
查看>>
简洁侧边wordpress博客模板
查看>>
linux及安全第四周总结——20135227黄晓妍
查看>>
搞出来,PHP mysql JQuery 二级联动
查看>>
AviSynth入门与应用指南
查看>>
ubuntu14.04安装GoldenDict
查看>>
重装系统时启动失败,引导信息有错误,修复磁盘的主引导记录MBR方法
查看>>
字符数组 字符指针
查看>>
Jedis的使用
查看>>
文献笔记(一)
查看>>
Linux(CentOS6.5)下修改Nginx初始化配置
查看>>