关闭

JAVA高级视频_IO输入与输出04 学习笔记

536人阅读 评论(0) 收藏 举报

节点流

首先理解什么是流?流式字节序列的抽象概念,例如,文件输入输出设备,网络,内存,内部进程通讯管道,TCP/IP套接字等数据传输的数据系列,都可以理解为流,流提供了统一的方式从各种输入输出设备中读取或者向其中写入自己数据的统一的方法。

 

文件和流的区别,文件是数据的静态存储形式,是具有永久存储的特定的字节有序组成的具有名称的数据的集合,就好比是水库,而流是指传输时的形态,提供了一种从IO设备中读取或者写入的方式,文件只是流可操作的设备之一,其他的例如,网络流,内存流,数据流是一连串数据传输的集合,就像水管里的水流一样,在水管的一端一点一点的供水,在程序的另一端看到的是一股连续不断的水流,用于写入的程序可以一段接着一段的向数据流管道中写入数据,这写数据段灰按先后顺序形成一个长的数据流,对于读取数据的程序来说,它看不到数据写入时的分段情况,每次可以读取任意长度的数据,但是只能是先读取前面的数据,然后再读取后面的数据,不管数据是分为多少次写入,还是作为一个整体写入,读取的效果都应该是完全一样的,JAVA中提供了提供众多的对流操作的类,通过这些流类,应用程序可以很方便地从IO设备中读取和从IO设备中写入各种类型的数据。

 

JAVA中的流分为两个大类,节点流和过滤流(也叫处理流),直接操作目标设备所对应的类叫做节点流类,节点流类所对应的IO源或者目标称为流节点,譬如,我们用一个类和某个文件根网络直接相关联,这个类就叫做节点流类,这个文件、网络就叫做流的节点,程序也可以通过哟个间接的流类去调用这个节点流类,以达到更加灵活方便地读取各种类型的数据,譬如,我们要通过网络传输对象,我们就可以设计一种叫做对象流的这种类,但实际上是要调用底层的网络流类,所以他叫包装类,不管这些类是处理流类、包装类还是包装类,他们都只是一个代名词而已。

 

InputStream类,程序可以连续从中读取字节的对象,java中所有输入流的抽象概念都用,这是一个类,描述的是所有的流设备的共性,描述了读取各种流类的通用方法,对应的网络、管道内存、文件等具体IO设备的那些流类,都是InputStream的子类,该类的方法有:

 int read()以整数形式返回实际读取的字节数,读到文件的末尾,返回-1,流没有结束,而暂时又没有数据可读,那么这个方法阻塞,例如,网络流中对方没有给自己传输数据,但是我们建立的通道又没有关闭,因为int是0到255,所以不可能出现-1,出现的就是末尾,int read(byte [] b),一个字节都读不到就阻塞,返回-1 int read(byte[]b,int off,int len), long skip(long n)跳过输入中的n个字节,返回的是实际跳过的字节数,n为负数,不跳过任何字节数,int avaiable()就是检测流里面是不是有可读的数据,void mark(int reaflimit),在输入流中标记当前的位置,从标记的位置开始最多还能读取多少个字节,

void reset(),让指针回到mark标记的地方,boolean marksupported(),测试此流是否支持mark和rest标记,void close() ,关闭此输入流并释放与该流关联的所有系统资源.InputStream是抽象的类,但是其子类并不全部支持类中的方法。有了垃圾回收机制,为什么还要关闭流资源呢?

 

一个对象在没有引用指向他的时候,就会变成垃圾,在某个不确定的时间里,就会被垃圾回收器清楚,在程序中创建的对象都是用来描述现实世界中有形或者无形的事物的,流是操作系统所产生的资源,当程序创建了一个留的对象时,也会创建流的资源,在这个时候,java程序中实际产生了两个实例对象,一个是java程序的类实例对象,一个时系统本身产生的资源,java的垃圾回收器只会管理java的类实例对象,不会管理系统的资源,所以我们需要条用close方法去释放系统所表示的流资源。

 

OutputStream,输出流,程序可以向其中连续写入字节的对象叫做输出流。是抽象类,描述的是流类通用的方法,void write(int b)向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 void write(byte[]b,int off,int length)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。void write(byte[] b)将 b.length 个字节从指定的 byte 数组写入此输出流,void flush()刷新此输出流并强制写出所有缓冲的输出字节。void close() 关闭此输出流并释放与此流有关的所有系统资源。

 

 

在应用程序和IO设备之间,通常都会有一个内存缓冲区,这是因为计算机访问外部设备的速度比访问内部设备的速度慢很多,如果我们每次write方法的调用都直接将数据写入外部设备中,例如硬盘,cpu就要花更多的时间把数据真正的存储起来,而使用内存缓冲区,就可以提高菜谱的使用率,write方法也没有真正的写入到IO设备中,而是写到了缓冲中,程序还可以撤回部分写入的数据,程序使用缓冲区可以提高整个系统的执行效率,但是也会降低单个程序自身的执行效率,有了缓冲区,数据并没有真正一次写到设备中,会造成网络流的滞后,java中可以自定义缓冲区,有的不需要。当缓冲区没填满的时候,需要调用flush()j将其强制删除,使用了缓冲区的OutputStream调用flush()方法才有用,close方法也可以起到类似的作用。

 

 

网络程序出现崩溃的原因很多,最好将网络程序执行的每一个动作都存放在文件中,当程序崩溃以后呢,只要打开记录文件,查看文件最后执行所记录的信息,根据这些信息,从演程序崩溃前所执行的过成功,重现程序崩溃时的情况,观察程序崩溃的原因,症状,然后再编写解决办法,

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:106289次
    • 积分:2131
    • 等级:
    • 排名:第17872名
    • 原创:110篇
    • 转载:4篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论