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 方法更为高效;
强制对基础存储设备进行文件的更新,确保在系统崩溃时不丢失数据;
可以锁定某个文件区域,以阻止其他程序对其进行访问;
以一种可被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到某个其他通道中。
分享到:
相关推荐
JavaIO流详解归纳 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...
Java IO是Java编程中至关重要的一个模块,它用于处理输入和输出操作,涵盖了从磁盘、网络到内存的各种数据交互。以下是对Java IO的详细学习总结: ### 1. IO流概述 IO流是Java中处理输入输出的核心概念。它们可以被...
Java IO流是Java平台中用于处理输入输出的重要机制,它允许程序与外部设备(如硬盘、网络、内存等)之间交换数据。以下是对Java IO流的详细解释: 1. **IO流的分类**: - **按方向**:Java IO流分为输入流和输出流...
Java的IO流是Java语言中处理输入输出操作的重要部分,主要包含在`java.io`包中。Java的IO体系设计独特,使用了装饰器模式,允许开发者动态地组合不同的流,以实现特定的功能。流的概念是指数据从源到目的地的有序...
import java.io.IOException; import java.util.Iterator; import java.util.Locale; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio....
6. **输入/输出流**:Java的IO系统支持对文件、网络、内存等的读写操作,包括InputStream、OutputStream、Reader、Writer等抽象基类和具体实现。 7. **多线程**:Java内置了对多线程的支持,可以通过实现Runnable...
Java体系笔记归纳.zip包含了丰富的Java学习资源,涵盖了Java的基础、MySQL数据库、JDBC连接、HTML、CSS3等多个重要知识点。以下是对这些主题的详细解析: 1. **Java基础**: Java是世界上最流行的编程语言之一,以...
Java的IO流处理数据输入和输出,包括字节流、字符流、文件流、对象流等,还有缓冲流、转换流、管道流等。 八、网络编程: 涉及网络协议、UDP和TCP传输,以及套接字编程。 九、反射技术: 反射允许程序在运行时检查...
这篇文章主要针对Java初学者,旨在分享关于Java基础知识的归纳和建议。Java是一种广泛使用的编程语言,尤其在企业级应用开发中占据重要地位。对于新手来说,掌握Java的基础知识至关重要,以下是一些关键点的详细说明...
Java面试题归纳主要涵盖了许多核心的Java编程概念和技术,这些是面试官在招聘Java开发者时经常询问的主题。以下是一些重要的知识点,它们可能出现在面试题中: 1. **基础语法**:包括变量、数据类型、运算符、流程...
这份"java重点知识归纳.pdf"文档概述了Java开发的基础知识,包括安装、环境配置、版本、编程步骤、注释、变量与常量、数据类型以及类型转换等方面。 1. **JDK与JRE**:JDK是Java开发工具包,包含了开发Java应用程序...
4. **文件操作**:Java的`java.io`包提供了文件读写功能。对于保存和打开图形文件,可以将画布上的内容序列化为图像文件(如BMP或PNG),或者使用XML或JSON格式存储图形数据,然后在需要时反序列化。 5. **异常处理...
本文将对Java类库中的一些常用类进行归纳和详细讲解。 首先,我们来看`Java.lang`包下的`Enum`。枚举在Java中是一种特殊的类,用于定义一组固定的常量。枚举的定义语法如下: ```java [Modifier] enum enumName{ ...
IO流处理文件、网络数据,而集合框架如ArrayList、LinkedList、HashMap等则提供了数据存储和操作的结构。 二、Java集合 Java集合框架是数据结构和算法的实现,包括List(如ArrayList和LinkedList)、Set(如HashSet...
NIO(New IO)则是Java 1.4引入的增强IO操作的新特性,它提供了非阻塞的I/O操作,提高了并发性能。 对于并发编程,Java提供了线程和同步机制。线程是并发执行的最小单位,通过创建和管理线程,可以实现多任务并行。...
这类题目要求应聘者具备敏锐的观察力和归纳能力,能够在有限的信息中找出潜在的规律和逻辑关系。例如,题目可能会给出一系列数字或图形,应聘者需要通过推理找出下一个应该出现的数字或图形,并解释其规律。这样的...
- 学习Java IO流的不同种类(如字节流、字符流、输入流、输出流)及其应用场景。 - 理解NIO(非阻塞I/O)的工作原理,包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。 3. **多式联运组合优化**...
在Java中,所有的I/O操作都是通过“流”来完成的,这些流被组织在`java.io`包中。 首先,根据流的方向,Java的流可以分为输入流和输出流。输入流用于将数据从源头(如文件、网络连接或其他数据源)传输到程序,而...
### Java调用视频转换工具FFmpeg知识点归纳 #### 一、环境配置与文件准备 **1.1 FFmpeg工具的安装与配置** - **下载与安装:** - 首先,确保已经在本地计算机上安装了FFmpeg工具。可以在官方网站上下载适合...
以上只是Java语法的一部分,完整的Java语言还包括异常处理、接口、内部类、集合框架、IO流、多线程、网络编程等众多内容。学习Java,不仅需要理解语法,还要掌握面向对象设计原则,如 SOLID 原则,以及良好的编程...