Java 1.0和Java 1.1 的IO类的比较
java 1.0 io系统介绍
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基本类对比表
表02_java 1.0和java 1.1的io装饰器对比表
之所以将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 java io例子
package com.skywang;
import java.io.*;
public class iotest{
publicstaticvoidmain(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();
}
}
}
推荐阅读
-
Java 1.0和Java 1.1 的IO类的比较
-
浅谈Java抽象类和接口的个人理解
-
Java中继承thread类与实现Runnable接口的比较
-
定义两个接口,其中各包括一个抽象方法分别用来完成两个数的加法和减法操作,然后创建一个类KY6_3来实现这两个接口中的抽象方法。编写程序KY6_3.java,将源程序写在实验报告中。
-
Java基本数据类和其包装类型之间的比较
-
玩转数据结构java - 数组类5 - 均摊复杂度和防止复杂度的震荡
-
Java中接口和抽象类的区别?
-
Java8与传统的日期和时间类详解
-
Java通过反射调用其他类的私有属性和私有方法
-
Java 获取当前类名和方法名的实现方法