Java I/O 总结

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

Java I/O流的概述

Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable。掌握了这些就掌握了Java I/O的精髓了。

Java I/O主要包括如下3层次:

  1. 流式部分——最主要的部分。如:OutputStream、InputStream、Writer、Reader等
  2. 非流式部分——如:File类、RandomAccessFile类和FileDescriptor等类
  3. 其他——文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

主要类如下:

  1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
  2. InputStream(字节流,二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
  3. OutputStream(字节流,二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
  4. Reader(字符流,文本格式操作):抽象类,基于字符的输入操作。
  5. Writer(字符流,文本格式操作):抽象类,基于字符的输出操作。
  6. RandomAccessFile(随机文件操作):它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作

I:O体系.png

java.io包里有4个基本类:InputStream、OutputStream及Reader、Writer类,它们分别处理字节流和字符流。

其他各种各样的流都是由这4个派生出来的。

I/O流

按来源/去向分类:

  1. File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
  2. byte[]:ByteArrayInputStream, ByteArrayOutputStream
  3. Char[]: CharArrayReader, CharArrayWriter
  4. String: StringBufferInputStream, StringReader, StringWriter
  5. 网络数据流:InputStream, OutputStream, Reader, Writer

InputStream

InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。 继承自InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit);(参考文章:Java中的Java.io.InputStream类)

InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:

  • public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束。
  • public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的
  • public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
  • public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,
  • public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
  • public int close( ) :使用完后,必须对我们打开的流进行关闭。

来看看几种不同的InputStream:

  1. FileInputStream把一个文件作为InputStream,实现对文件的读取操作
  2. ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
  3. StringBufferInputStream:把一个String对象作为InputStream
  4. PipedInputStream:实现了pipe的概念,主要在线程中使用
  5. SequenceInputStream:把多个InputStream合并为一个InputStream

OutputStream

OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。(参考文章:Java中的Java.io.OutputStream类

  • public void write(byte b[ ]):将参数b中的字节写到输出流。
  • public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。
  • public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。
  • public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。
  • public void close( ) : 关闭输出流并释放与流相关的系统资源。

几种不同的OutputStream:

  1. ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
  2. FileOutputStream:把信息存入文件中
  3. PipedOutputStream:实现了pipe的概念,主要在线程中使用
  4. SequenceOutputStream:把多个OutStream合并为一个OutStream

Reader和InputStream类似;Writer和OutputStream类似。

有两个需要注意的:

  1. InputStreamReader : 从输入流读取字节,在将它们转换成字符。
  2. BufferReader :接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。

总结Java中的IO包中的类

IO包中的类 描述
Console Java.io.Console类提供了访问与当前Java虚拟机关联的基于字符的控制台console设备(如果有的话)的方法。Console类由JDK 6添加到java.io中。
InputStream Java.io.InputStream类是所有io类的超类,即表示输入的字节流。它代表输入的字节流。定义InputStream的子类的应用程序必须提供方法,返回下一个输入字节。
File Java.ioFile类是Java表示的文件或目录路径名。
FileInputStream Java.io.FileInputStream用于读取诸如图像数据等原始字节流。为了读取字符流,请考虑使用FileReader。
FilterInputStream Java.io.FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。它的常用的子类有BufferedInputStream和DataInputStream。
BufferedInputStream Java.io.BufferedInputStream继承于FilterInputStream,提供缓冲输入流功能。缓冲输入流相对于普通输入流的优势是,它提供了一个缓冲数组,每次调用read方法的时候,它首先尝试从缓冲区里读取数据,若读取失败(缓冲区无可读数据),则选择从物理数据源(譬如文件)读取新数据(这里会尝试尽可能读取多的字节)放入到缓冲区中,最后再将缓冲区中的内容部分或全部返回给用户.由于从缓冲区里读取数据远比直接从物理数据源(譬如文件)读取速度快。
DataInputStream Java.io.DataInputStream是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据。
PushBackInputStream Java.io.PushBackInputStream在JAVA中提供了一种回退输入流(PushbackInputStream、PushbackReader),可以把读取进来的某些数据重新回退到输入流的缓冲区之中。
PipedInputStream Java.io.PipedInputStream也用PipedOutputStream管道。因此,可以使用PipedOutputStream来写入数据,并且可以使用PipedInputStream来写入数据。但是,同时使用两个线程会为线程创建死锁。
SequenceInputStream Java.io.SequenceInputStream类允许您连接多个InputStream。它逐个读取数据流。它从输入流的有序集合开始,并从第一个读取到文件结束,然后从第二个读取,依此类推,直到最后一个包含的输入流达到文件结束。
ByteArrayInputStream Java.io.ByteArrayInputStream类包含所有缓冲区,包含要从输入流中读取的字节。ByteArrayInputStream类方法没有IO异常。这个类的方法甚至可以在关闭Stream之后调用,它对类方法没有影响。
OutputStream Java.io.OutputStream这个抽象类是代表输出字节流的所有类的超类。输出流接受输出字节并将它们发送到某个接收器。
FileOutputStream Java.io.FileOutputStream把信息存入文件中
FilterOutputStream Java.io.FilterOutputStream类是所有那些过滤输出流的类的超类。FilterOutputStream类的write()方法过滤数据并将其写入基础流,根据Streams进行过滤。
BufferedOutputStream Java.io.BufferedOutputStream类实现缓冲输出流。通过设置这样的输出流,应用程序可以将字节写入底层输出流,而不必为写入的每个字节调用底层系统。
DataOutputStream Java.io.DataOutputStream数据输出流允许应用程序以便携方式将原始Java数据类型写入输出流。然后应用程序可以使用数据输入流来读取数据。
PrintStream | 2 Java.io.PrintStream将功能添加到另一个输出流,即可方便地打印各种数据值的表示。
PipedOutputStream Java.io.PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流。
它们的作用是让多线程可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。
ByteArrayOutputStream  Java.io.ByteArrayOutputStream类创建一个用于将数据写入字节数组的输出流。数据写入时,缓冲区的大小会自动增大。关闭byteArrayOutputStream对其方法的工作没有影响。
Reader Java.io.Reader这是一个阅读字符流的抽象类。子类必须实现的唯一方法是读取(char [],int,int)和close()。但是,大多数子类会覆盖此处定义的一些方法,以提供更高的效率,更多的功能或兼具两者。
FileReader Java.io.FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件。
FilterReader Java.io.FilterReader用于读取过滤的字符流的抽象类。抽象类FilterReader本身提供了将所有请求传递给包含的流的默认方法。FilterReader的子类应该重写其中的一些方法,并且还可以提供其他方法和字段。
StringReader Java.io.StringReader这是一个字符流类,其源是一个字符串。
PipedReader Java.io.PipedReader这个类基本上是一个管道字符输入流。
CharArrayReader Java.io.CharArrayReader类使用字符数组创建字符缓冲区。
InputStreamReader Java.io.InputStreamReader是从字节流到字符流的桥梁。它读取字节并使用指定的字符集将它们解码为字符。它使用的字符集可以用名字指定,也可以明确给出,或者可以接受平台的默认字符集。
BufferedReader Java.io.BufferedReader从字符输入流中读取文本,缓冲字符以提供字符,数组和行的高效读取。
PushbackReader Java.io.PushbackReader是一个字符流阅读器类,允许将字符推回到流中。
Writer Java.io.Writer是写入字符流的抽象类。子类必须实现的唯一方法是write(char [],int,int),flush()和close()。但是,大多数子类会覆盖此处定义的一些方法,以提供更高的效率,更多的功能或兼具两者。
FileWriter Java.io.FileWriter 类从 OutputStreamWriter 类继承而来。该类按字符向流中写入数据。
StringWriter Java.io.StringWriter类通过字符串缓冲流的字符创建字符串。
PipedWriter Java.io.PipedWriter这个类基本上是一个管道字符输出流。
CharArrayWriter | 2 Java.io.CharArrayWriter类创建一个可以用作编写器的字符缓冲区。
OutputStreamWriter Java.io.OutputStreamWriter用于将写入的字符编码成字节后写入一个字节流
BufferedWriter  Java.io.BufferedWriter类将文本写入字符输出流,缓冲字符。因此,可以高效地写入单个数组,字符和字符串。需要指定缓冲区大小,如果不是,则需要默认值。Writer立即将输出设置为底层字符或字节流。
FileDescriptor  Java.io.FileDescriptor用于打开具有特定名称的文件。
LineNumberInputStream Java.io.LineNumberInputStream类只是输入流的扩展,提供了额外的功能来保留当前行号的记录。
LineNumberReader Java.io.LineNumberReader是一个缓冲的字符输入流,用于跟踪行号。这个类定义了方法setLineNumber(int)和getLineNumber(),分别用于设置和获取当前行号。
PrintWriter | 2 Java.io.PrintWriter该类将对象的格式化表示形式打印到文本输出流。它实现了PrintStream中的所有打印方法。它不包含写入原始字节的方法,程序应使用未编码的字节流。
StreamTokenizer | 2 Java.io.StreamTokenizer类将输入流解析为“标记”。它允许一次读取一个标记。流标记器可以识别数字,带引号的字符串和各种评论样式。

Java util包中一些文件操作

ZipInputStream class in Java: 该类实现一个输入流过滤器,用于读取ZIP文件格式的文件。包括对压缩和未压缩条目的支持。
ZipEntry class in Java:该类用于表示ZIP文件条目。
JarEntry class in Java:该类用于表示JAR文件条目。
ZipOutputStream class in Java:该类实现一个输出流过滤器,用于以ZIP文件格式写入文件。包括对压缩和未压缩条目的支持。
Zip.InflaterInputStream class in Java:这个类实现了一个流过滤器,用于以“deflate”压缩格式解压缩数据。它也被用作其他解压过滤器的基础,比如GZIPInputStream。
Zip.DeflaterInputStream class in Java:实现一个输入流过滤器,用于压缩“deflate”压缩格式的数据。
Zip.DeflaterOutputStream class in Java:该类实现了一个输出流过滤器,用于压缩“deflate”压缩格式的数据。它也被用作其他类型压缩过滤器的基础,例如GZIPOutputStream。

  •   本文标题:Java I/O 总结 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/14711.html

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读