八:Java之I/O
一、什么是IO
Java中I/O操作主要是指使用Java进行输入,输出操作. Java全部的I/O机制都是基于数据流进行输入输出。这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。不论什么Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的还有一端看到的是一股连续不断的水流。数据写入程序能够是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说。看不到数据流在写入时的分段情况。每次能够读取当中的随意长度的数据。但仅仅能先读取前面的数据后,再读取后面的数据。
无论写入时是将数据分多次写入,还是作为一个总体一次写入。读取时的效果都是全然一样的。
“流是磁盘或其他外围设备中存储的数据的源点或终点。”在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比方电脑上的硬盘。磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大。其次是内存。最后是缓存,可是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们能够简单的理解为容器。即外存是一个容器,内存又是另外一个容器。那又如何把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?
在Java类库中。IO部分的内容是非常庞大的,由于它涉及的领域非常广泛:
标准输入输出,文件的操作。网络上的数据流。字符串流。对象流。zip文件流等等,java中将输入输出抽象称为流。就好像水管。将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流。将数据从内存写入外存中的称为输出流。
流是一个非常形象的概念,当程序须要读取数据的时候。就会开启一个通向数据源的流,这个数据源能够是文件。内存。或是网络连接。
类似的,当程序须要写入数据的时候,就会开启一个通向目的地的流。
二、分类:
1、按流向分类:
输入流: 程序能够从中读取数据的流。
输出流: 程序能向当中写入数据的流。
2、按传输数据单位分类:
字节流:以字节(8位二进制)为单位进行处理。主要用于读写诸如图像或声音的二进制数据。
字符流:以字符(16位二进制)为单位进行处理。
都是通过字节流的方式实现的。字符流是对字节流进行了封装,方便操作。在最底层,全部的输入输出都是字节形式的。
3、按功能分类:
节点流:从特定的地方读写的流类。如磁盘或者一块内存区域。
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或者输出流连接创建的
三、输入/输出流
输入流
程序从输入流读取数据源。
数据源包含外界(键盘、文件、网络…)。即是将数据源读入到程序的通信通道
输出流:
程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。
四、字节/字符流
字节流是运行基于8位字节的输入和输出。它一次读写一字节的数据。字节流是I / O的最底层流技术,因此,假设你正在阅读或写入字符数据的最佳方法是使用字符流。其它流类型是建立在字节流之上的(如Java中的InputStream、OutputStream)。
字符流是运行基于16位字节(即两字节)的输入和输出,它一次读写一个字符(两个字节)的数据。全部的字符流类都是从Reader、Writer两个类延伸下来的。我们能够使用FileReader、FileWriter类进行读写I/O文件
五、节点/处理流
节点流:节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,比如FileInputStream和FileOutputStream,他们直接从文件里读取或往文件里写入字节流。
处理流:
“连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是使用一个已经存在的输入流或输出流连接创建的,过滤流就是对节点流进行一系列的包装。比如BufferedInputStream和BufferedOutputStream,使用已经存在的节点流来构造。提供带缓冲的读写,提高了读写的效率,以及DataInputStream和DataOutputStream,使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。他们都属于过滤流。