用JAVA的IO流里的哪个类效率最高

如题所述

Java中IO流分成两大类,
一种是输入流,所有的输入流都直接或间接继承自InputStream抽象类,输入流作为数据的来源,我们可以通过输入流的read方法读取字节数据;
另一种是输出流,所有的输出流都直接或间接继承自OutputStream抽象类,输出流接收数据,可以通过write方法写入字节数据。

Java的IO流类中,大部分的输入流和输出流都是成对存在的,即如果存在XXXInputStream,那么就存在XXXOutputStream,反之亦然。SequenceInputStream和StringBufferInputStream是特例,没有对应的SequenceOutputStream类和StringBufferOutputStream类,许多IO操作都可能会抛出IOException异常,比如read、write、close操作。
以下是Java的IO流中常见的输入流,由于每个输入流都有其对应的输出流,所以此处就不再列出输出流的继承结构图。

1、ByteArrayInputStream & ByteArrayOutputStream:
ByteArrayInputStream构造函数中需要传入一个byte数组作为数据源,当执行read操作时,就会从该数组中读取数据,正如其名,是一种基于字节数组实现的一种简单输入流,显而易见的是,如果在构造函数中传入了null作为字节数据,那么在执行read操作时就会出现NullPointerException异常,但是在构造函数初始化阶段不会抛出异常;与之相对应的是ByteArrayOutputStream,其内部也有一个字节数组用于存储write操作时写入的数据,在构造函数中可以传入一个size指定其内部的byte数组的大小,如果不指定,那么默认它会将byte数组初始化为32字节,当持续通过write向ByteArrayOutputStream中写入数据时,如果其内部的byte数组的剩余空间不能够存储需要写入的数据,那么那么它会通过调用内部的ensureCapacity
方法对其内部维护的byte数组进行扩容以存储所有要写入的数据,所以不必担心其内部的byte数组太小导致的IndexOutOfBoundsException之类的异常。
2、FileInputStream & FileOutputStream
FileInputStream 能够将文件作为数据源,读取文件中的流,通过File对象或文件路径等初始化,在其构造函数中,如果传入的File对象(或与其相对应的文件路径所表示的File对象)不存在或是一个目录而不是文件或者由于其他原因无法打开读取数据,都会导致在初始化阶段导致抛出FileNotFoundException异常;与FileInputStream 相对应的是FileOutputStream,可以通过FileOutputStream向文件中写入数据,也需要通过File对象或文件路径对其初始化,如同FileInputStream ,如果传入的File对象(或与其相对应的文件路径所表示的File对象)是一个目录而不是文件或者由于其他原因无法创建该文件写入数据,都会导致在初始化阶段抛出FileNotFoundException异常。
3、PipedInputStream & PipedOutputStream
PipedInputStream和PipedOutputStream一般是结合使用的,这两个类用于在两个线程间进行管道通信,一般在一个线程中执行PipedOutputStream 的write操作,而在另一个线程中执行PipedInputStream的read操作。可以在构造函数中传入相关的流将PipedInputStream 和PipedOutputStream 绑定起来,也可以通过二者的connect方法将二者绑定起来,一旦二者进进行了绑定,那么PipedInputStream的read方法就会自动读取PipedOutputStream写入的数据。PipedInputStream的read操作是阻塞式的,当执行PipedOutputStream的write操作时,PipedInputStream会在另一个线程中自动读取PipedOutputStream写入的内容,如果PipedOutputStream一直没有执行write操作写入数据,那么PipedInputStream的read方法会一直阻塞PipedInputStream的read方法所运行的线程直至读到数据。单独使用PipedInputStream或单独使用PipedOutputStream时没有任何意义的,必须将二者通过connect方法(或在构造函数中传入对应的流)进行连接绑定,如果单独使用其中的某一个类,就会触发IOException: Pipe Not Connected.
4、ObjectInputStream & ObjectOutputStream
ObjectOutputStream具有一系列writeXXX方法,在其构造函数中可以掺入一个OutputStream,可以方便的向指定的输出流中写入基本类型数据以及String,比如writeBoolean、writeChar、writeInt、writeLong、writeFloat、writeDouble、writeCharts、writeUTF等,除此之外,ObjectOutputStream还具有writeObject方法。writeObject方法中传入的类型必须实现了Serializable接口,从而在执行writeObject操作时将对象进行序列化成流,并将其写入指定的输出流中。与ObjectOutputStream相对应的是ObjectInputStream,ObjectInputStream有与OutputStream中的writeXXX系列方法完全对应的readXXX系列方法,专门用于读取OutputStream通过writeXXX写入的数据。
5、SequenceInputStream
SequenceInputStream 主要是将两个(或多个)InputStream在逻辑上合并为一个InputStream,比如在构造函数中传入两个InputStream,分别为in1和in2,那么SequenceInputStream在读取操作时会先读取in1,如果in1读取完毕,就会接着读取in2。在我们理解了SequenceInputStream 的作用是将两个输入流合并为一个输入流之后,我们就能理解为什么不存在对应的SequenceOutputStream 类了,因为将一个输出流拆分为多个输出流是没有意义的。
6、StringBufferInputStream
StringBufferInputStream允许通过在构造函数中传入字符串以读取字节,在读取时内部主要调用了String的charAt方法。与SequenceInputStream类似,StringBufferInputStream也没有对应的OutputStream,即不存在StringBufferOutputStream类。Java没有设计StringBufferOutputStream类的理由也很简单,我们假设StringBufferOutputStream存在,那么StringBufferOutputStream应该是内部通过执行write操作写入数据更新其内部的String对象,比如有可能是通过StringBuilder来实现,但是这样做毫无意义,因为一旦我们String的构造函数中可以直接传入字节数组构建字符串,简单明了,所以设计StringBufferOutputStream就没有太大的必要了。StringBufferInputStream这个类本身存在一点问题,它不能很好地将字符数组转换为字节数组,所以该类被Java标记为废弃的(Deprecated),其官方推荐使用StringReader作为代替。
温馨提示:内容为网友见解,仅供参考
无其他回答

用JAVA的IO流里的哪个类效率最高
Java的IO流类中,大部分的输入流和输出流都是成对存在的,即如果存在XXXInputStream,那么就存在XXXOutputStream,反之亦然。SequenceInputStream和StringBufferInputStream是特例,没有对应的SequenceOutputStream类和StringBufferOutputStream类,许多IO操作都可能会抛出IOException异常,比如read、write、close操作。

java io流如何读取文件效率高
如果你想读取文本内容,你应该使用InputStreamReader这个类,使用这个类并且指定文本内容的字符集,就可以读出正确的内容。InputStream这个类是用来读取二进制字节的,比如做文件复制的时候,应该是用InputStream这个类。不管是InputStreamReader还是InputStream,都可以声明临时缓冲数组,不同的是InputStreamReader声...

快速掌握java中的IO与NIO面试题
4. 阻塞与非阻塞IO模型阻塞IO可能导致用户线程阻塞,非阻塞IO则不会,但需要频繁查询数据就绪。多路复用IO通过一个线程管理多个连接,效率更高,但处理大数据可能导致性能问题。5. NIO核心与应用NIO以Channel、Buffer和Selector为核心,Channel是双向操作的基础,Buffer存储数据便于处理,Selector实现多通道事件...

关于JAVA IO流
io流主要也就分两大类:一、字节流、字符流 二、输入流、输出流最基本的也就是FileInputStream\/FileOutputStream和InputStreamReader\/OutputStreamReader掌握这两种,其他也确实类似以下是看到别人总结的一些关于io流的,希望对你有帮助Java IO的一般使用原则:一、按数据来源(去向)分类:1、是文件:File...

java io流中涉及到了哪些设计模式
1、装饰器模式 Java IO流使用了装饰器模式,通过继承和实现抽象类或接口来扩展一个流的功能。例如,BufferedInputStream和BufferedOutputStream都是装饰器类,它们为InputStream和OutputStream添加了缓冲功能。2、工厂模式 Java IO流使用工厂模式来创建各种类型的流对象。例如,FileInputStream和FileOutputStream都...

Java中nio与普通io有什么优势?
Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法...

java中的io流有哪些
IO流的分类:(1)按照数据的流向:输入流、输出流 (2)按照流数据的格式:字符流、字节流 (3)按照流数据的包装过程:节点流(低级流)、处理流(高级流)最基本的几种进行简单介绍:•InputStream\/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。•OutputStream\/...

javaio流涉及到哪些设计模式
Reader bufferedReader = new BufferedReader(reader);在这个例子中,我们通过串联FileInputStream、InputStreamReader和BufferedReader对象,创建了一个具有缓冲功能和字符转换功能的流。2. 适配器模式(Adapter Pattern):在Java IO流中,适配器模式的应用体现在如InputStreamReader和OutputStreamWriter等类的设计...

java中关于io流的问题
1 遍历 目录树,找到每一个.txt文件,每当找到一个txt时,启动一个新线程,解密,找出tarena所在行,并保存相关数据在内存如hashmap中,2 应用程序从hashmap中直接获取所有的内容 这种策略牺牲的是读的时间 其他差不多 第三种策略 使用lucene框架,主要是针对每个文件建立分词索引,这里意义不大,所以...

五节课带你走入IO流之一数据流和对象流
可能会导致"InvalidClassException",这时需要提供一个固定的序列化版本号来确保兼容性。总的来说,本节内容包括了如何使用数据流处理基本类型数据,对象流处理各种数据类型(包括基本和引用类型),以及序列化和反序列化的基本原理和关键点。通过掌握这些,你可以更好地理解和利用IO流进行数据操作。

相似回答