Java的IO基于装饰器模式设计。根接口是InputStream/OutputStream,根据来源不同充当数据源的有 FileInputStream/FileOutputStream, ByteArrayInputStream/ByteArrayOutputStream等,充当装饰功能的IO类有 BufferedInputStream/BufferedOutputStream, DataInputStream/DataOutputStream,CheckedInputStream/CheckedOutputStream 等,他们都继承于装饰类 FilterInputStream/FilterOutputStream。
1.表示数据源的流
以字节为导向InputStream/OutputStream
ByteArrayInputStream:把内存中的一个缓冲区作为 InputStream使用,内部通过byte[]实现。
StringBufferInputStream:把一个String对象作为 InputStream,已过时,此类未能正确地将字符转换为字节,从一个串创建一个流的最佳方法是采用StringReader类。
FileInputStream:把一个文件作为InputStream,实现对文件的读取操作。
PipedInputStream:实现了pipe的概念,主要在线程中使用。管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,
这样可实现两个线程间的通讯。
SequenceInputStream:把多个InputStream合并为一个InputStream。允许应用程序把几个输入流连续地合并起来,并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾,然后关闭这个流并自动地切换到下一个输入流。
ByteArrayOutputStream:把信息存入内存中的一个缓冲区中.该类以byte[]写入数据的输出流,当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。
FileOutputStream:文件输出流是向 File或FileDescriptor输出数据的一个输出流
PipedOutputStream:管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯.
SequenceOutputStream:把多个OutStream合并为一个OutStream.
以Unicode字符为导向 InputStream/OutputStream
以Unicode字符为导向的stream,表示以Unicode字符为单位从 stream中读取或往stream中写入信息。包括下面几种类型:
CharArrayReader:与 ByteArrayInputStream对应
StringReader:与StringBufferInputStream对应
FileReader:与FileInputStream对应
PipedReader:与PipedInputStream对应
CharArrayWrite:与ByteArrayOutputStream对应
StringWrite:无与之对应的以字节为导向的stream
FileWrite:与FileOutputStream对应
PipedWrite:与PipedOutputStream对应
两者之间的区别和转换
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
InputStreamReader:是从字节流到字符流的桥梁。它读入字节,并根据指定的编码方式,将之转换为字符流。使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。
OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。每个OutputStreamWriter会合并它自己的 CharToByteConverter。
2.用于属性包装方面的装饰流
用于封装以字节为导向的InputStream/OutputStream
DataInputStream:从stream中读取基本类型(int、char、double、long等)。
BufferedInputStream:使用缓冲区,缓冲区其实也是byte[]实现的,可指定缓冲大小。默认4K。
LineNumberInputStream:已过时,此类错误假定字节能充分表示字符,由LineNumberReader替代。它提供跟踪当前行号的附加功能,会记录input stream内的行数。
PushbackInputStream:添加“取消读取 (unread)”一个字节的功能。方法是将其复制到推回缓冲区前面。
DataOutputStream:往stream中输出基本类型(int、char、double、long等)。
BufferedOutStream:使用缓冲区,缓冲区其实也是byte[]实现的.可指定缓冲大小。默认4K。
PrintStream:产生格式化输出。它还提供其他两项功能。与其他输出流不同,PrintStream 不会抛出 IOException;异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream,这意味着可在写入字节数组之后自动调用 flush 方法。
用于封装以字符为导向的InputStream/OutputStream
BufferedReader:与BufferedInputStream对应。
LineNumberReader:与LineNumberInputStream对应。
PushBackReader:与PushbackInputStream对应。
BufferedWrite:与BufferedOutStream对应。
PrintWrite:与PrintStream对应。
PS:没有与DataInputStream/DataOutputStream对应的类。需要使用readLine()时改用 BufferedReader,否则使用DataInputStream。对于write同样。
3.DataInput/DataOutput,ObjectInput /ObjectOutput等
DataInput/DataOutput是用于从流内读取/写入 Java基本类型,直接实现子类就是DataInputStream/DataOutputStream.
ObjectInput/ObjectOutput 在上面的基础上扩展了对象、数组和String的读写方法,直接的实现子类就是 ObjectInputStream和ObjectOutputStream。只有支持 java.io.Serializable或java.io.Externalizable接口的对象才能被正确的读取和写入。如果要做特殊的处理就需要重写writeObject(ObjectOutputStream stream),readObject(ObjectInputStream stream),readObjectNoData()等方法。
ImageInputStream/ImageOutputStream是在 DataInput/DataOutput的基础上针对Image的操作做了扩展。
4.RandowmAccessFile,FileChannel
RandowmAccessFile 是实现了DataInput和DataOutput的类,以文件作为数据源。随机存取文件的行为类似存储在文件系统中的一个大型字节数组。存在指向该隐含数组的光标或索引,称为文件指针.该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置.它可以做到随机存取;设定读写权限;预先设置文件大小,防止写操作文件碎片的产生。
FileChannel可以从 RandowmAccessFile、FileInputStream、FileOutputStream得到,它的好处在于:
对文件中绝对位置的字节进行读取或写入;
将文件中的某个区域直接映射到内存中,对于较大的文件,这通常比调用普通的 read 或 write 方法更为高效;
强制对基础存储设备进行文件的更新,确保在系统崩溃时不丢失数据;
可以锁定某个文件区域,以阻止其他程序对其进行访问;
以一种可被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到某个其他通道中。
分享到:
相关推荐
有关Java输入输出流的总结有关Java输入输出流的总结有关Java输入输出流的总结
Java IO总结 Java IO是Java中对文件的操作方式,以流的方式进行。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件...
Java io流的总结
JavaIO总结[借鉴].pdf
javaIO总结,帮助初学者了解及掌握IO,以及java高级的一些基础知识
java基础中的IO流部分的总结,有详细的知识点描述,思维导图的整体框架
Java IO系统主要包括两个包:`java.io`和`java.nio`(New IO),其中`java.io`提供了一系列基于流的I/O操作接口与实现类,而`java.nio`则提供了更高效的数据访问方式,如通道和缓冲区等。 Java IO系统的设计原则之...
JAVA_IO流学习总结
Java IO流总结 Java IO流是Java语言中最基本和最重要的输入/输出机制,负责将数据从外部世界输入到Java应用程序中或将数据从Java应用程序输出到外部世界。IO流可以分为两大类:字节流和字符流。 1. 节点流:离数据...
这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、文件操作、对象序列化以及NIO(非阻塞IO)等多个方面进行展开。 一、Java IO体系结构 Java IO体系是Java平台中用于处理数据输入...
这是别人总结的很有实用价值的javaIO流教程。
下面是对Java IO流的详细总结: 1. 流的概念: 流是一种抽象的数据传输方式,可以将数据从一个地方传输到另一个地方。Java中的流分为输入流和输出流,分别用于读取和写入数据。流按照处理数据的不同类型,又可以...
总结来说,Java NIO提供了一种更高效、更适合处理并发的IO模型,尤其在服务器端开发中,如高并发的网络应用,NIO的优势更为明显。理解和掌握Java IO与NIO的使用,对于提升Java应用程序的性能和可扩展性至关重要。
总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...
#### 五、Java IO总结 Java IO是一个强大的框架,它支持各种不同的流类型,包括字节流和字符流。通过使用装饰模式,开发人员可以轻松地扩展流的功能,而无需修改原始流的实现。这种灵活性使得Java IO成为处理文件和...
在这个大总结中,我们将深入探讨Java IO流的基本概念、分类、常用类以及实践应用。 1. **基本概念** - **流(Stream)**:在Java中,流是一个抽象的概念,代表数据的有序序列。它可以是字节流或字符流,流向可以是...
这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...