java io流不关闭有什么后果_Java IO流

java io流不关闭有什么后果_Java IO流_第1张图片

一、基本概念

IO是Java对数据的操作是通过流的方式,数据传输是需要通道的,而IO流就是数据传输的通道。IO流可以形象的比喻为运送货物的传输带。IO流用来处理设备之间的数据传输,上传文件和下载文件,Java用于操作流的对象都在IO包中。总结一下,Java IO输入机制就是为了允许程序读取外部数据(包括来自于磁盘、光盘等存储设备的数据)和用户输入的数据。

Java的IO流通过java.io包下的类和接口来支持,在java.io包下主要包括输入、输出两种IO流,每种输入、输出流又可以分为字节流和字符流两大类,其中字节流以字节为单位来处理输入和输出操作,而字符流则以字符来处理输入和输出操作,除此以外,Java的IO流使用了装饰者设计模式,将IO流又分为底层节点流和上层的处理流,其中节点流用于和底层的物理存储节点直接关联——不同的物理节点获取节点流的方式可能存在一定的差异,但是程序可以把不同的物理节点流包装成统一的处理流,从而允许程序使用统一的输入和输出代码来读取不同的物理存储节点的资源。

二、IO流分类

2.1、根据操作的数据类型的不同可以分为 :字节流与字符流

字节流就是传输过程中,传输数据的最基本单位是字节的流,字节流的类通常以stream结尾;

字符流就是传输过程中,传输数据的最基本单位是字符的流。

其中1字符 = 2字节 、 1字节(byte) = 8位(bit) 、 一个汉字占两个字节长度。

字节流和字符流的区别:

  • 字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法;
  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节;
  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据;

2.2、根据数据的流向分为:输入流与输出流

程序(内存)作为参照物,程序从外部读取称为输入Input),程序向外部写数据成为输出Output)。

java io流不关闭有什么后果_Java IO流_第2张图片

2.3、根据具体功能分为:节点流和处理流

节点流:以从或向一个特定的地方(节点)读写数据。如FileInputStream

处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

常用的节点流如下:   

1、文件: FileInputStreamFileOutputStreamFileReaderFileWriter 文件进行处理的节点流;   

2、字符串: StringReaderStringWriter 对字符串进行处理的节点流;   

3、数组: ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组);   

4、管道: PipedInputStreamPipedOutputStreamPipedReaderPipedWriter对管道进行处理的节点流;   

5、父类: InputStreamOutputStreamReaderWriter

常用处理流如下:(关闭处理流会自动调用关闭里面节点流的方法)   

1、缓冲流:BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter   增加缓冲功能,避免频繁读写硬盘。   

2、转换流:InputStreamReaderOutputStreamReader实现字节流和字符流之间的转换。   

3、数据流 DataInputStreamDataOutputStream等提供将基础数据类型写入到文件中,或者读取出来。

流关闭的原则:先打开先关闭;如果A依赖B,则先关闭A再关闭B;对于处理流如果将节点流关闭以后再关闭处理流,会抛出IO异常,所以直接关闭处理流就行了,会自动调用关闭里面节点流的方法。

注意:1、如果将节点流关闭以后再关闭处理流,会抛出IO异常;2、如果关闭了处理流,在关闭与之相关的节点流,也可能出现IO异常。

三、IO流体系

java io流不关闭有什么后果_Java IO流_第3张图片

通常来讲,字节流的功能比字符流的功能强大,因为计算机里所有的数据都是二进制的,而字节流可以处理所有的二进制文件——但是问题是,如果使用字节流来处理文本文件(能用记事本打开并能看到其中的字符内容的是文本文件,反之是二进制文件),则需要使用合适的方式把这些字节转化成字符,这就增加了编程的复杂度,所以通常有一个规则:如果进行输入/输出的内容是文本内容,则应该考虑使用字符流,如果进行输入/输出的内容是二进制内容,则应该考虑使用字节流。

所有的流都继承InputStreamoutputStreamReaderWriter4个基本的流抽象类:

3.1、字节输入流

java io流不关闭有什么后果_Java IO流_第4张图片

ByteArrayInputStream:字节数组输入流,它的内部缓冲区就是一个字节数组,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取资源文件;

PipedInputStream:管道字节输入流,它和

你可能感兴趣的:(java,io流不关闭有什么后果,javaio流,java文件流不关闭的后果,下面(,)对象表示标准输入对象流。,图片图片二进制流,接口间传递,文件流)