一.什么是IO

java中IO操作主要是指使用Java进入输入,输出操作Java进行输入,输出操作,java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。

Java.io是大多数面向数据流的输入/输出类的主要软件包。此外,Java也对快传输提供支持,在核心库 java.nio中采用的是便是块IO.

流IO的好处是简单易用,缺点是效率较低,块IO效率很高,但编程比较复杂。

Java IO模型:

Java的IO模型设计非常优秀,它使用Decorator模式,按功能划分Stream,您可以动态装配这些Stream,以便获得您需要的功能,例如,您需要1一个具有缓冲的文件输入流,则应当组合使用FIleInputStream和BufferedInputSteam.

二.数据流的基本概念

数据流是一串连续不断的数据的集合,就像水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序是一段,一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。

“流是磁盘或其它外围设备中存储的数据的源点或终点。”

在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,但是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是另外一个容器。那又怎样把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?

在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:

标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。
三.java.IO层次体系结构

在整个Java.IO包中最重要的就是5个类和一个接口。5个类指的是File,OutputStream,InputSteeam,Writer,Reader一个接口是serializable,掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识。

Java I/O主要包括如下几个层次,包含三个部分:

流式部分——IO的主体部分;

非流式部分——主要包含一些辅助流式部分的类

其他类——文件读取部分的安全相关的类,如:serializablepermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

主要的类如下

File(文件特征与管理):用于文件或目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。

InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。

OutputStream(二进制格式操作):抽象类。基于字节的输出操作,是所有输出流的父类

Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此JAVA中引入了处理字符的流。

Reader(文件格式操作):抽象类,基于字符的输入操作。

Writer(文件格式操作):抽象类,基于字符的输出操作

RandomAccessFile(随机文件操作):它的功能丰富,可以从文件任意位置进行存取(输入,输出操作) 

字节流和字符流

io流效率 java java中io流重要么_数据库


字节流和字符流的操作方式几乎完全一样,区别只是操作的数据单元不同而已。字节流操作的数据单元

是字节,字符流操作的数据单元是字符。

InputStream和Reader是所有输入流的抽象基类,它们的方法是所有输入流都可使用的方法。

四、打印流

打印流提供了非常方便的打印功能,可以打印任何的数据类型,例如:小数、整数、字符串等等。打印流只有输出没有输入。是 一种 处理流 【打印流是输出信息做方便的类,主要包含字节打印流(PrintStream)和字符打印流】

格式字符:格式字符用以指定输出项的数据类型和输出格式

d格式:用来输出十进制整数。有以下几种用法:

(1)、%d:按整型数据的实际长度输出

(2)、%s:例如:printf("%s", “CHINA”)输出"CHINA"字符串(不包括双引号)

(3)、%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。

五、 访问字符串

访问字符串的两大方法:StringReader()和StringWriter()

StringReader:用来将字符串转换成字符输入流。然后使用字符输入流提供的方式进行操作,也可以提供给其他高级字符输入流来使用。如可以将该字符输入流提供给BufferedReader输入流使用

StringWriter:在内存中缓存读取到的所有字符串,然后使用通过toString方法一次性全部输出字符串

六、RandomAccessFile类

RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法 来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。RandomAccessFile支持“随机访问”的方式,程序可以直接跳转到文件的任意地方来读写数据。

RandomAccessFile几种访问模式:

(1)、r":以只读方式打开指定文件。如果试图对该RandomAccessFile执行写入方法,都将抛出IOException 异常

(2)、“rw”:以读、写方式打开指定文件。如果该文件尚不存在,则尝试创建该文件

RandomAccessFile依然不能向文件的指定位置插入内容,如果直接将文件记录指针移动到中间某位置后开始输出,则输出的内容会覆盖文件中原有的内容。如果需要向指定位置插入内容,程序需要先把插入点后面的内容读入缓冲区,等把需要插入的数据写入文件后,再将缓冲区的内容追加到文件后面

七、 对象序列化

对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。

序列化的含义和意义:

序列化机制允许将实现序列化的Java对象转换成字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在对象的序列化(Serialize)指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象如果需要让某个对象支持序列化机制,则必须让它的类是可序列化的(serializable)

为了让某个类是可序列化的,该类必须实现如下接口之一:

Serializable(常用):

(1)、该类必须实现的接口:ExternalizableJava很多类已经实现了Serializable,该接口是一个标记接口,实现该接口无须实现任何方法,它只是表明该类的实例是可序列化的

(2)、所有可能在网络上传输的对象的类都应该是可序列化的,否则程序将会出现异常