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();
       }
    }
}

(0)

相关推荐

  • JAVA annotation入门基础

    一. 最常见的annotation•@Override:用在方法之上,用来告诉别人这一个方法是改写父类的•@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上. •@SuppressWarnings:暂时把一些警告信息消息关闭•@Entity:表示该类是可持久化的类 二. 设计一个自己的Annotation先看代码再讲话1. 只有一个参数的Annotation实现 复制代码 代码如下: package chb.test.anno

  • JAVA IO API使用详解

    一.理论准备流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以"流"的方式进行,设备可以是文件.网络.内存等.流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序(小马哥说的是机器)为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流,可以将流想象成一个"水流管道"(很多资料都这么讲的),自然就出现了方向的概念.流把I/O设备内部的具体操作给隐藏起来了.所有InputStream和Reader的派

  • java中 IO 常用IO操作类继承结构分析

    IO 常用IO操作类继承结构 IO 字符流 Reader(源) BufferedReader LineNumberReader InputStreamReader FileReader(字节流通向字符流的桥梁)       StringReader         Writer(目的) BufferedWriter       OutputStreamWriter FileWriter(字符流通向字节流的桥梁)       StringWriter 空       PrintWriter 空  

  • 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系统是字符

  • Android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError的解决方法

    解决方法 首先把方法写出来,起因和经过和原理写在后面,时间仓促的直接看解决方法吧. 一般出现这个错都是使用的provided导致的 例如,我的旧配置如下: Project build.gradle文件: buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.0.1' // need delete in gradle3.x version classpath 'com.neenbedankt.gradle.

  • Win10 Java jdk14.0.2安装及环境变量配置详细教程

    1.下载安装 下载地址:https://www.oracle.com/java/technologies/javase-jdk14-downloads.html ,根据提示进行安装,记住安装路径,这里路径为:E:\Java\jdk14.0.2 2.环境变量配置  新版的jdk中默认不含有jre目录,通过如下方式生成:首先进入命令行,切换至安装路径,并运行以下命令: bin\jlink.exe --module-path jmods --add-modules java.desktop --out

  • CentOS8.2安装Java 14.0.2的教程详解

    Java是一种安全,稳定且广为人知的通用编程语言和计算技术平台,具有许多相互关联的功能. 要运行基于Java的应用程序,必须在服务器上安装Java.您通常需要Java Runtime Environment(JRE),这是用于在Linux机器上运行Java应用程序的软件组件的集合. 如果要开发Java的软件应用程序,则需要安装Oracle Java开发工具包(JDK),该工具包带有一个完整的JRE软件包,其中包含用于开发,调试和监视Java应用程序的工具,它是Oracle支持的Java SE(标

  • [JAVA]十四种Java开发工具点评

    在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美的,就算是老鸟也很难做出选择.在本文中我简要介绍了常见的十四种Java开发工具的特点,管中窥"器",希望能对大家有所帮助. 1.JDK (Java Development Kit) 2.Java Workshop 3.NetBeans 与Sun Java Studio 5 4.Borlan

  • Java入门基础之Java的基本语法与Java所支持的数据类型

    Java 应用程序可以被定义为对象的集合,这些对象通过调用各自的方法来进行通信.下面让我们具体看一看类,对象,方法,实体变量是什么含义. 对象:对象具有状态和行为.例如:狗有它的状态-颜色,名字,品种,同时也有行为-摇尾巴,汪汪叫,吃东西.对象时类的一个实例. 类:类可以被定义为描述对象所支持的类型的行为和状态的模板或蓝图. 方法:方法是一种基本的行为.类中可以包含很多方法.在方法中,可以编写逻辑,操纵数据,执行动作. 实体变量:每个对象都有它的特殊的实体变量的集合,一个对象的状态是由那些实体变

  • Java基于装饰者模式实现的图片工具类实例【附demo源码下载】

    本文实例讲述了Java基于装饰者模式实现的图片工具类.分享给大家供大家参考,具体如下: ImgUtil.java: /* * 装饰者模式实现图片处理工具类 * 类似java的io流 - * Img类似低级流可以独立使用 * Press和Resize类似高级流 * 需要依赖于低级流 */ package util; import java.io.File; import java.util.List; /** * 图片工具类(装饰者)和图片(被装饰者)的公共接口 * @author xlk */

  • java正则表达式的应用 java读取文件并获取电话号码

    实现功能:读取文件,将其中的电话号码存入一个Set返回. 方法介绍: find():尝试查找与该模式匹配的输入序列的下一个子序列. group():返回由以前匹配操作所匹配的输入子序列. 1.从一个字符串中获取出其中的电话号码 import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 从字符串中截取出电话号码 * @au

  • java实现多线程的两种方式继承Thread类和实现Runnable接口的方法

    实现方式和继承方式有什么区别呢? *区别: *继承Thread:线程代码存放在Thread子类run方法中 *实现Runnable:线程代码存放在接口的子类的run方法中 *实现方式的好处:避免了单继承的局限性 *在定义线程时,建议使用实现方式,当然如果一个类没有继承父类,那么也可以通过继承Thread类来实现多线程 *注意:Runnable接口没有抛出异常,那么实现它的类只能是try-catch不能throws *Java对多线程的安全问题提供了专业的解决方式就是同步代码块synchroniz

  • 深入浅出Java mvc_动力节点Java学院整理

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识,MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑和数据显式分离的方法组织代码,将业务逻辑被聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务

随机推荐