Java 1.0和Java 1.1 的IO类的比较
发布时间:2023-10-07 10:48:39
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();
}
}
}


猜你喜欢
- 前言最近对 base-spring-boot 项目进行了升级。在将其用于应用开发中时遇到java.lang.ArrayStoreE
- 时间轮关于时间轮的介绍,网上有很多,这里就不重复了核心思想一个环形数组存储时间轮的所有槽(看你的手表),每个槽对应当前时间轮的最小精度超过当
- 一、So的热升级尝试在Android代码中,加载so库是通过调用System.loadLibrary函数实现的。但和Android的许多特性
- 编辑Word文档时,我们有时会突然想增加一段新内容;而将word文档给他人浏览时,有些信息我们是不想让他人看到的。那么如何运用C#编程的方式
- 在 Java 中,当我们处理String时,有时需要将字符串编码为特定字符集。编码是一种将数据从一种格式转换为另一种格式的方法。字符串对象使
- 基本介绍BottomSheetDialog是底部操作控件,可在屏幕底部创建一个支持滑动关闭视图。目前依赖使用如下:implementatio
- 1.需在jsp页面引入头文件:<%@ taglib prefix="form" uri="http://
- 俗话说没有规矩就没有方圆,java作为一门严谨的面向对象的高级编程语言,自然对权限整个重要的问题有严格的控制。Java中,可以通过一些Jav
- 本文实例讲述了Android使用ListView实现下拉刷新及上拉显示更多的方法。分享给大家供大家参考,具体如下:今天得需求是做listvi
- 本文实例讲述了Java实现的简单网页截屏功能。分享给大家供大家参考,具体如下:package awtDemo;import java.awt
- 1.前言MyBatis框架大家肯定都用过的,废话我就不再多说了,这篇文章就给大家分享一下有关MyBatis框架底层的执行原理吧(Debug!
- 一、现象在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应。关于该服务的基本功能如下:1、该服务是一个后台刷新指示器
- 测试spring cloud 使用consul注册服务的时候,出现critical,如下:怎么解决这个问题,现在只能看到health che
- 最近在修改Android7.0原生平台的一些bug,其中有关Android Beam传输文件的一些问题还是蛮多的。所以特地找时间总结下曾经踏
- 大顶堆每个结点的值都大于或等于其左右孩子结点的值小顶堆每个结点的值都小于或等于其左右孩子结点的值对比图实现代码public class He
- 目录No1. 自定义控件模板No2. 重写控件No3. 附加属性来试试总结文章默认你已经入门WPF了WPF日常开发,经常遇到默认的控件功能不
- arthas能够更改日志的级别,下面是logger的用法查看logger信息,更新logger level查看所有logger信息logge
- 本文实例讲述了Android自定义个性化的Dialog。分享给大家供大家参考,具体如下:Dialog:mDialog = new Dialo
- 特别是针对循环或timer处理中需要在窗体控件显示数据时,因后台处理过度繁忙而出现没刷新或者假死现象时,可以使用Application.Do
- 有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对