Java编程那些事儿85——IO类体系

11.2 I/O类体系

在JDK API中,基础的IO类都位于java.io包,而新实现的IO类则位于一系列以java.nio开头的包名中,这里首先介绍java.io包中类的体系结构。

按照前面的说明,流是有方向的,则整个流的结构按照流的方向可以划分为两类:

1、输入流:

该类流将外部数据源的数据转换为流,程序通过读取该类流中的数据,完成对于外部数据源中数据的读入。

2、输出流:

该类流完成将流中的数据转换到对应的数据源中,程序通过向该类流中写入数据,完成将数据写入到对应的外部数据源中。

而在实际实现时,由于JDK API历史的原因,在java.io包中又实现了两类流:字节流(byte stream)和字符流(char stream)。这两种流实现的是流中数据序列的单位,在字节流中,数据序列以byte为单位,也就是流中的数据按照一个byte一个byte的顺序实现成流,对于该类流操作的基本单位是一个byte,而对于字节流,数据序列以char为单位,也就是流中的数据按照一个char一个插入的顺序实现成流,对于该类流操作的基本单位是一个char。

另外字节流是从JDK1.0开始加入到API中的,而字符流则是从JDK1.1开始才加入到API中的,对于现在使用的JDK版本来说,这两类流都包含在API的内部。在实际使用时,字符流的效率要比字节流高一些。

在实际使用时,字符流中的类基本上和字节流中的类对应,所以在开始学习IO类时,可以从最基础的字节流开始学习。

在SUN设计JDK的IO类时,按照以上的分类,为每个系列的类设计了一个父类,而实现具体操作的类都作为该系列类的子类,则IO类设计时的四个体系中每个体系中对应的父类分别是:

11.2.1 字节输入流InputStream

该类是IO编程中所有字节输入流的父类,熟悉该类的使用将对使用字节输入流产生很大的帮助,下面做一下详细的介绍。

按照前面介绍的流的概念,字节输入流完成的是按照字节形式构造读取数据的输入流的结构,每个该类的对象就是一个实际的输入流,在构造时由API完成将外部数据源转换为流对象的操作,这种转换对程序员来说是透明的。在程序使用时,程序员只需要读取该流对象,就可以完成对于外部数据的读取了。

InputStream是所有字节输入流的父类,所以在InputStream类中包含的每个方法都会被所有字节输入流类继承,通过将读取以及操作数据的基本方法都声明在InputStream类内部,使每个子类根据需要覆盖对应的方法,这样的设计可以保证每个字节输入流子类在进行实际使用时,开放给程序员使用的功能方法是一致的。这样将简化IO类学习的难度,方便程序员进行实际的编程。

默认情况下,对于输入流内部数据的读取都是单向的,也就是只能从输入流从前向后读,已经读取的数据将从输入流内部删除掉。如果需要重复读取流中同一段内容,则需要使用流类中的mark方法进行标记,然后才能重复读取。这种设计在使用流类时,需要深刻进行体会。

在InputStream类中,常见的方法有:

a、available方法

public int available() throws IOException

该方法的作用是返回当前流对象中还没有被读取的字节数量。也就是获得流中数据的长度。

假设初始情况下流内部包含100个字节的数据,程序调用对应的方法读取了一个字节,则当前流中剩余的字节数量将变成99个。

另外,该方法不是在所有字节输入流内部都得到正确的实现,所以使用该方法获得流中数据的个数是不可靠的。

b、close方法

public void close() throws IOException

该方法的作用是关闭当前流对象,并释放该流对象占用的资源。

在IO操作结束以后,关闭流是进行IO操作时都需要实现的功能,这样既可以保证数据源的安全,也可以减少内存的占用。

时间: 2024-08-31 06:52:35

Java编程那些事儿85——IO类体系的相关文章

Java编程那些事儿92——IO使用注意问题

11.3.4 注意问题 上面介绍了IO类的基本使用,熟悉了实体流和装饰流的基本使用,但是在IO类实际使用时,还是会遇到一系列的问题,下面介绍一些可能会经常遇到的问题. 11.3.4.1 类的选择 对于初次接触IO技术的初学者来说,IO类体系博大精深,类的数量比较庞大,在实际使用时经常会无所适从,不知道该使用那些类进行编程,下面介绍一下关于IO类选择的一些技巧. 选择类的第一步是选择合适的实体流. 选择实体流时第一步是按照连接的数据源种类进行选择,例如读写文件应该使用文件流,如FileInputS

Java编程那些事儿84——IO简介

第十一章 I/O处理 I/O(Input/Output)是输入和输出的简称,在Java语言中所有和输入输出有关的都属于IO处理技术,例如包含文件的读写和网络数据的发送等. 其实整个计算机实现功能时最主要的就是IO,用户使用鼠标.键盘等输入设备向程序输入数据,程序进行一定的逻辑处理,然后再将处理结果以一定的形式显示到显示器等输出设备上. I/O处理技术是Java语言中实现文件操作.内存操作.控制台输入以及网络编程的基础,但是由于I/O技术本身的设计原因,也使得I/O处理技术的难度比较大,需要花费比

Java编程那些事儿76——StringBuffer类和System类

9.5.3.2 StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类. 所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入.删除等操作,使用StringBuffer要更加适合一些. 在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能

Java编程那些事儿75——String类使用

9.5.3 String和StringBuffer String和StringBuffer类都是代表字符串,也就是任意多个字符组成的序列.程序需要存储的大量文字一般都使用字符串进行代表.在这两个类中,包含了大部分关于字符串操作的方法,在实际操作字符串时,可以首先查阅这两个类中的方法. String和StringBuffer虽然都代表字符串,但是由于两个类内部实现的区别,所以一般把String看成不可变字符串,而把StringBuffer看成可变字符串,对于String的每次改变(例如字符串连接等

Java编程那些事儿88——文件操作之写文件

11.3.1.4 写文件 如前所述,将程序内部的数据输出到程序外部的数据源,应该使用IO类体系中的输出流.在实际的编程中,将程序中的数据,例如用户设定或程序运行时生成的内容,存储到外部的文件中,应该使用输出流进行编程. 基本的输出流包含OutputStream和Writer两个,区别是OutputStream体系中的类(也就是OutputStream的子类)是按照字节写入的,而Writer体系中的类(也就是Writer的子类)是按照字符写入的. 使用输出流进行编程的步骤是: 1.建立输出流 建立

Java编程那些事儿52—方法声明

第七章 方法 方法(method),在面向过程的语言中称作函数(function),在汇编语言中称作子程序,是一个代码功能块,实现某个特定的功能.在实际的程序开发中,方法是一种基础的组织代码的方式.本部分就介绍方法相关的概念.相关语法以及实际使用时需要注意的问题. 7.1 方法概述 方法的概念来源于数学上的函数,在数学中,当数据具有一定的规律时,就是用一个函数来代码该数字的规律,例如f(n)=n则代表1.2.3.--这样的一个数列.在数学上n是参数,对于确定的n值只有一个f(n)的值和它对应.

Java编程那些事儿25—位运算符

4.5 二进制运算符 由于计算机内部的数据都以二进制的形式存在,所以在Java语言中提供了直接操作二进制的运算符,这就是下面要讲解的位运算符和移位运算符. 使用二进制的运算符,可以直接在二进制的基础上对数字进行操作,执行的效率比一般的数学运算符高的多,该类运算符大量适用于网络编程.硬件编程等领域. 二进制运算符在数学上的意义比较有限. 在Java代码中,直接书写和输出的数值默认是十进制,Java代码中无法直接书写二进制数值,但是可以书写八进制和十六进制数字,八进制以数字0开头,例如016,十六进

Java编程那些事儿3——你适合学习程序设计吗?

 Java编程那些事儿3--你适合学习程序设计吗?作者:陈跃峰出自:http://blog.111cn.net/mailbomb          程序设计是一个技术活,所以不是适合所有的人.现在很多人听说程序设计人员待遇如何如何的好,都一窝蜂的来学习程序,其实这个现象很不正常,因为程序不一定适合你.其实对于一个人来说,适合你的才是最好的.         就像现在很多小孩子都被家长逼着去学钢琴啊什么,有些小孩根本没有艺术细胞的,所以学习的效果就是差强人意了.         其实程序设计最需要

Java编程那些事儿4——如何学好程序设计?

  Java编程那些事儿4--如何学好程序设计?作者:陈跃峰出自:http://blog.111cn.net/mailbomb          俗话说"兴趣是最好的老师",但是只靠兴趣是远远不够的,还需要付出艰辛的努力.程序设计是一种技能,需要在较短的时间内学会,就不能像学习汉语一样,通过十几年甚至更长的时间来学好,也不能像英语那样进行业余学习,以至很多大学毕业的人英语水平也不敢恭维,也达不到实用的程度.         那么如何学好程序设计呢?或者更现实一点,如何在短时间内成为一个