我对IO流的理解上并没什么问题,但前一片段上课时有经常使用到IO流。发现自己对JAVAIO流没有系统的概念,JAVAIO流的要类是InputStream和OutputStream,这两个类的子类较多,而且还有一部分的包装类。SO,我要对JAVAIO流有一个系统的学习。
JAVA IO 全视图:
InputStream部分:
InputStream,它是一个抽象类,所示所有输入流的的超类。它包含了输入流的基本操作。
AudioIntpuStream,音频输入流对应的输出。结合AudioSystem可以实现:
1. 从外部音频文件、流或 URL 获得音频输入流
2. 从音频输入流写入外部文件
3. 将音频输入流转换为不同的音频格式
ByteArrayInputStream,字节数据输入流。字面的翻译。它包含了一个缓冲区,该缓冲区从输入游戏中读取字节。因为数据已经读入到缓冲区中,所以关闭流对它无效,仍然可以调用它的方法而不会抛出异常。
FileInputStream,文件输入流。从文件中获取输入字节,包含对文件流的特殊方法。如果要读取字符流,可以使用FileReader。
PipedInputStream,管道输入流。用于线程间的通讯,但不要在同一个线程中使用管道输入流和输出流,这样可能造成线程死锁。
SequenceInputStream,输入流的逻辑串联。它将多个输入流串联到一起读取。比如它串联了输入流A和B,当读取到A的结尾时,便从B流中接着读取。
StringBufferInputStream,与ByteArrayInputSteam类同,ByteArrayInputStream用于处理字节,而StringBufferInputStream用于处理字符。
ObjectInputStream,Java对象输入流。实现将对象从输入流中读取。比如将ObjectOutputStream与FileOutputStream结合使用,将JAVA对象序列化后保存到文件。然后再使用FileInputStream和ObjectInputStream将文件中被序列化的JAVA对象反序列化回来到程序中。也可以在远程通讯中使用对象流传输JAVA对象,这个比较高级。
FilterInputStream:JDK帮助文档中说它只是简单的重写将所有对输入流的操作传递给它所包含的InputStream输入流。嗯,其实它是一个Decorate模式的超类。从它继承了一些子类,用于提供一些额外的功能,向下看。
BufferedInputStream,对InputStream增加了缓存功能。以更好的支持mark和reset方法。
CheckedInputStream,校验输入流。可用于验证输入数据的完整性。与Checksum配合使用。
CipherInputStream,解密输入流。与Cipher配合使用。CipherOutputStream是加密输出流。对数据进行加解密使用。
DigestInputStream,摘要输入流。这个比较少见,棱一看JDK手册,不太了解。不过数据摘要是用于安全通讯或数据完整证验证的。哦,它与MessageDigest配合使用,可见JAVA IO设计者的用心!
LineNumberInputStream,行号输入流。此类已过时。它假定输入流是字符流,它调用InputStream的方法并将\n\r统一转换成一个\n。每读到一个换行时,便将行号加1,初始行号为0。此类不深入研究了!
ProgressMonitor,进度监视输入流。用于监视用户读取的进度,如果这个流很大。它会自动弹出进度提示窗口,用户可以点击“Cancel”按钮,取消读取。这个也实JAVAIO给实现了,比较人性化!
PushBackInputStream,推回输入流。就是可以将从输入流中读取的数据,调用unread方法将数据推回到输入流中,也可以将其他数据推进去。JDK手册中举了一个例子说,将标识符字符读取后,可以推回到输入然,然后重复读取,在哪里需要这样的应用呢?
DataInputStream,数据输入流。可以以与机器无关方式从底层输入流中读取基本JAVA数据类型。
InflaterInputStream: 解压缩输入流。解压缩以“deflate”压缩格式的流过滤器。它与Inflater配合使用,Inflater使用流行的ZLIB压缩库。
GZipInputStream,GZip解压缩输入流。解压缩以“GZip”压缩格式的流过滤器。
ZipInputStream,Zip解压缩输入流。解压缩以“Zip”压缩格式的流过滤器。
JarInputStream,Jar解压缩输入流。可以读取Jar文件中的内容。其实Jar的压缩格式就是Zip格式。但它比Zip多了一个Manifest条目。Manifest 可用于存储有关 JAR 文件及其条目的元信息。关于Manifest,可以查看JDK手册。
OK,OutputStream在此就不一一列出了。因为OutpuStream中子类与InputStream中的子类相对应。但OutpuStream不完全具有与InputStream中的子类对应的类。因为没必要,比如AudioInputStream,没有与之对应的AudioOutputStream,我们需要读取指定格式的音频即可。如果想写出音频数据直接用FileOutputStream即可!
Java中还有Writer和Reader两个超类,主要用于处理字符流,这个比较简单就不在此做介绍了。OK!