JDK_API剖析之java.io包

时间:2022-10-12 23:15:58

Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。

一、接口

1、Closeable

  • 接口
  • 自1.5开始有
  • 无父类和接口
  • Closeable 是可以关闭的数据源或目标。调用 close 方法可释放对象保存的资源(如打开文件)。

  • 定义了关闭此流并释放与此流关联的所有系统资源的方法 void close()。

2、DataInput

  • 接口
  • 自1.0开始有
  • 无父类和接口
  • DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构。同时还提供根据 UTF-8 修改版格式的数据重构 String 的工具。对于此接口中的所有数据读取例程来说,如果在读取所需字节数之前已经到达文件末尾 (end of file),则将抛出 EOFExceptionIOException 的一种)。如果因为到达文件末尾以外的其他原因无法读取字节,则将抛出 IOException 而不是 EOFException。尤其是,在输入流已关闭的情况下,将抛出 IOException

  • 定义了一些个readXX方法用来读取数据。

3、DataOutput

  • 接口
  • 自1.0开始有
  • 无父类和接口
  • ataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流。同时还提供了一个将 String 转换成 UTF-8 修改版格式并写入所得到的系列字节的工具。对于此接口中写入字节的所有方法,如果由于某种原因无法写入某个字节,则抛出 IOException

  • 定义了一些个writeXX方法用来读取数据。

4、Externalizable

  • 接口
  • 自1.2开始有
  • 继承Serializable
  • Externalizable 实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。 若某个要完全控制某一对象及其超类型的流格式和内容,则它要实现 Externalizable 接口的 writeExternal 和 readExternal 方法。这些方法必须显式与超类型进行协调以保存其状态。这些方法将代替定制的 writeObject 和 readObject 方法实现。
    Serialization 对象将使用 Serializable 和 Externalizable
    接口。对象持久性机制也可以使用它们。要存储的每个对象都需要检测是否支持 Externalizable 接口。如果对象支持
    Externalizable,则调用 writeExternal 方法。如果对象不支持 Externalizable 但实现了
    Serializable,则使用 ObjectOutputStream 保存该对象。在重构 Externalizable 对象时,先使用无参数的公共构造方法创建一个实例,然后调用 readExternal 方法。通过从 ObjectInputStream 中读取 Serializable 对象可以恢复这对象。Externalizable 实例可以通过 Serializable 接口中记录的 writeReplace 和 readResolve 方法来指派一个替代对象。

  • readExternal(ObjectInput in)和writeExternal(ObjectOutput out)

5、FileFilter

  • 接口
  • 自1.2开始有
  • 无父类和接口
  • 用于抽象路径名的过滤器。此接口的实例可传递给 File 类的 listFiles(FileFilter) 方法。

  • boolean  accept (File pathname),测试指定抽象路径名是否应该包含在某个路径名列表中。

6、FileFilter

  • 接口
  • 自1.0开始有
  • 无父类和接口
  • 实现此接口的类实例可用于过滤器文件名。Abstract Window Toolkit 的文件对话框组件使用这些实例过滤 File 类的 list 方法中的目录清单。

  • boolean  accept (File dir,String name),测试指定文件是否应该包含在某一文件列表中。

7、Flushable

  • 接口
  • 自1.0开始有
  • 无父类和接口
  • Flushable 是可刷新数据的目标地。调用 flush 方法将所有已缓冲输出写入底层流。

  • void flush(),通过将所有已缓冲输出写入底层流来刷新此流

8、ObjectInput

  • 接口
  • 自1.1开始有
  • 继承DataInput
  • ObjectInput 扩展 DataInput 接口以包含对象的读操作。DataInput 包括基本类型的输入方法;ObjectInput 扩展了该接口,以包含对象、数组和 String 的输出方法。

  • 有个方法Object readObject(),读取并返回对象。实现此接口的类定义从哪里“读取”对象。

9、ObjectInputValidation

  • 接口
  • 自1.1开始有
  • 无父类和接口
  • 允许验证图形中对象的回调接口。允许在反序列化完整的对象图形后调用对象。

  • void validataObject(),验证对象

10、ObjectOutput

  • 接口
  • 自1.1开始有
  • 继承DataOutput
  • ObjectOutput 扩展 DataOutput 接口以包含对象的写入操作。DataOutput 包括基本类型的输出方法;ObjectOutput 扩展了该接口,以包含对象、数组和 String 的输出方法。

11、ObjectStreamConstants

  • 接口
  • 自1.1开始有
  • 定义了一些写入 Object Serialization Stream 的常量。

  • 没有方法

12、Serializable

  • 标记接口
  • 自1.1开始有
  • 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。要允许不可序列化类的子类型序列化,可以假定该子类型负责保存和恢复超类型的公用 (public)、受保护的 (protected) 和(如果可访问)包 (package) 字段的状态。仅在子类型扩展的类有一个可访问的无参数构造方法来初始化该类的状态时,才可以假定子类型有此职责。如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。

  • 没有方法

二、类

13、BufferedInputStream

  • 自1.0开始有
  • 继承FilterInputStream
  • BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

14、BufferedOutputStream

  • 自1.1开始有
  • 继承FilterOutputStream
  • 该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

15、BufferedReader

  • 自1.0开始有
  • 继承Reader
  • 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

    可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

    通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,

     BufferedReader in
    = new BufferedReader(new FileReader("foo.in"));

    将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。

    通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化。

16、BufferedWriter

  • 自1.0开始有
  • 继承Writer
  • 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

    可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

    该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

    通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,

     PrintWriter out
    = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

    将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。

17、ByteArrayInputStream

  • 自1.0开始有
  • 继承InputStream
  • ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException

18、ByteArrayOutputStream

  • 自1.0开始有
  • 继承OutputStream
  • 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()toString() 获取数据。关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException

19、CharArrayReader

  • 自1.0开始有
  • 继承Reader
  • 此类实现一个可用作字符输入流的字符缓冲区。

20、CharArrayWriter

  • 自1.1开始有
  • 继承Writer
  • 此类实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。

    注:在此类上调用 close() 无效,并且在关闭该流后可以调用此类中的各个方法,而不会产生任何 IOException。

21、Console

  • 自1.6开始有
  • 实现Flushable
  • 此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有)。虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。如果此虚拟机具有控制台,那么它将由此类唯一的实例(可通过调用 System.console() 方法获得)表示。如果没有可用的控制台设备,那么对该方法的调用将返回 null

22、DataInputStream

  • 自1.0开始有
  • 继承FilterInputStream,实现DataInput
  • 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。

23、DataOutputStream

  • 自1.0开始有
  • 继承FilterOutputStream,实现DataOutput
  • 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

24、File

  • 自1.0开始有
  • 实现Serializable, Comparable< File>
  • 文件和目录路径名的抽象表示形式,File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。

25、FileDescriptor

  • final类
  • 自1.0开始有
  • 无父类和接口
  • 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的 FileInputStreamFileOutputStream。应用程序不应创建自己的文件描述符。

26、FileDescriptor

  • final类
  • 自1.0开始有
  • 无父类和接口
  • 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的 FileInputStreamFileOutputStream。应用程序不应创建自己的文件描述符。

27、FileInputStream

  • 自1.0开始有
  • 继承InputStream
  • FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader

28、FileOutputStream

  • 自1.0开始有
  • 继承OutputStream
  • 文件输出流是用于将数据写入 FileFileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter

29、FilePermission

  • final类
  • 自1.2开始有
  • 继承Permission,实现Serializable
  • 此类表示对文件和目录的访问。FilePermission 由路径名和对该路径名有效的操作集合组成。将所要授予的操作以字符串的形式传递给构造方法,该字符串包含由一个或多个用逗号分隔的关键字组成的列表。可能的关键字有 "read"、"write"、"execute" 和 "delete"。其含义定义如下:

30、FileReader

  • 自1.1开始有
  • 继承InputStreamReader
  • 用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream

31、FileWriter

  • 自1.1开始有
  • 继承OutputStreamReader
  • 用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。文件是否可用或是否可以被创建取决于底层平台。特别是某些平台一次只允许一个 FileWriter(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。FileWriter 用于写入字符流。要写入原始字节流,请考虑使用 FileOutputStream

32、FilterInputStream

  • 自1.0开始有
  • 继承InputStream
  • FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。FilterInputStream 类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。FilterInputStream 的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。

33、FilterOutputStream

  • 自1.0开始有
  • 继承OutputStream
  • 此类是过滤输出流的所有类的超类。这些流位于已存在的输出流(基础 输出流)之上,它们将已存在的输出流作为其基本数据接收器,但可能直接传输数据或提供一些额外的功能。FilterOutputStream 类本身只是简单地重写那些将所有请求传递给所包含输出流的 OutputStream 的所有方法。FilterOutputStream 的子类可进一步地重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。

34、FilterReader

  • 抽象类
  • 自1.1开始有
  • 继承Reader
  • 用于读取已过滤的字符流的抽象类。抽象类 FilterReader 自身提供了一些将所有请求传递给所包含的流的默认方法。FilterReader 的子类应重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。

35、FilterWriter

  • 抽象类
  • 自1.1开始有
  • 继承Writer
  • 用于写入已过滤的字符流的抽象类。抽象类 FilterWriter 自身提供了一些将所有请求传递给所包含的流的默认方法。FilterWriter 的子类应重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。

36、InputStream

  • 抽象类
  • 自1.0开始有
  • 实现Closeable
  • 此抽象类是表示字节输入流的所有类的超类。需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。

37、InputStreamReader

  • 自1.1开始有
  • 继承Reader
  • nputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

    每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

    为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:

     BufferedReader in
    = new BufferedReader(new InputStreamReader(System.in));

38、InputStream

  • 抽象类
  • 自1.0开始有
  • 实现Closeable
  • 此抽象类是表示字节输入流的所有类的超类。需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。

39、LineNumberReader

  • 自1.1开始有
  • 继承BufferedReader
  • 跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int)getLineNumber(),它们可分别用于设置和获取当前行号。

    默认情况下,行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用 setLineNumber(int) 更改行号。但要注意的是,setLineNumber(int) 不会实际更改流中的当前位置;它只更改将由 getLineNumber() 返回的值。

    可认为行在遇到以下符号之一时结束:换行符('\n')、回车符('\r')、回车后紧跟换行符。

40、ObjectInputStream

  • 自1.1开始有
  • 继承InputStream,实现ObjectInput,ObjectStreamConstants
  • ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。

41、ObjectOutputStream

  • 自1.0开始有
  • 继承OutputStream,实现ObjectInput,ObjectStreamConstants
  • ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

    只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

    writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。

    还可以使用 DataOutput 中的适当方法将基本数据类型写入流中。还可以使用 writeUTF 方法写入字符串。

    对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。其他对象的引用(瞬态和静态字段除外)也会导致写入那些对象。可使用引用共享机制对单个对象的多个引用进行编码,这样即可将对象的图形恢复为最初写入它们时的形状。

42、ObjectStreamClass

  • 自1.1开始有
  • 实现Serializable
  • 类的序列化描述符。它包含类的名称和 serialVersionUID。可以使用 lookup 方法找到/创建在此 Java VM 中加载的具体类的 ObjectStreamClass。计算 SerialVersionUID 的算法在 Object Serialization Specification, Section 4.6, Stream Unique Identifiers 中描述。

43、ObjectStreamField

  • 自1.0开始有
  • 实现Comparable< Object>
  • Serializable 类中 Serializable 字段的描述。ObjectStreamField 的数组用于声明类的 Serializable 字段。

44、OutputStream

  • 抽象类
  • 自1.0开始有
  • 实现Closeable,Flushable
  • 此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。需要定义 OutputStream 子类的应用程序必须始终提供至少一种可写入一个输出字节的方法。

45、OutputStreamWriter

  • 自1.0开始有
  • 继承Writer
  • utputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

    每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

    为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:

     Writer out
    = new BufferedWriter(new OutputStreamWriter(System.out));

    代理对 是一个字符,它由两个 char 值序列表示: 代理项的范围为 '\uD800' 到 '\uDBFF',后跟范围为 '\uDC00' 到 '\uDFFF' 的 代理项。

    错误代理元素 指的是后面不跟低代理项的高代理项,或前面没有高代理项的低代理项。

    此类总是使用字符集的默认替代序列 替代错误代理元素和不可映射的字符序列。如果需要更多地控制编码过程,则应该使用 CharsetEncoder 类。

46、PipedInputStream

  • 自1.0开始有
  • 继承InputStream
  • 管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。 如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏

47、PipedOutputStream 48、PipedReader 49、PipedWriter

  • 管道相关输入处理字节和字符流。

50、PrintStream

  • 自1.0开始有
  • 继承FilterOutputStream,实现Appendable,Closeable
  • PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream;这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 ('\n')。

    PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。

51、PrintWriter

  • 自1.1开始有
  • 继承Writer
  • 向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。

    PrintStream 类不同,如果启用了自动刷新,则只有在调用 printlnprintfformat 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。

    此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError() 是否出现错误。

52、PushbackInputStream 53、PushbackReader

  • 自1.0开始有
  • 继承FilterInputStream
  • PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。在代码片段可以很方便地读取由特定字节值分隔的不定数量的数据字节时,这很有用;在读取终止字节后,代码片段可以“取消读取”该字节,这样,输入流上的下一个读取操作将会重新读取被推回的字节。例如,表示构成标识符字符的字节可能由表示操作符字符的字节终止;用于读取一个标识符的方法可以读取到遇到操作符为止,然后将该操作符推回以进行重读。

54、RandomAccessFile

  • 自1.0开始有
  • 实现DataOutput, DataInput, Closeable
  • 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。

    通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException

55、Reader

  • 自1.1开始有
  • 实现java.lang.Readable, Closeable
  • 用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

56、SequenceInputStream

  • 自1.0开始有
  • 继承InputStream
  • SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

57、SerializablePermission

  • final类
  • 自1.2开始有
  • 继承BasePermission
  • 此类用于可序列化权限。SerializablePermission 包含一个名称(也称为“目标名称”),但没有动作列表;可以使用,也可以不使用指定权限。目标名称是可序列化权限的名称.

58、StreamTokenizer

  • 自1.0开始有
  • 无父
  • StreamTokenizer 类获取输入流并将其解析为“标记”,允许一次读取一个标记。解析过程由一个表和许多可以设置为各种状态的标志控制。该流的标记生成器可以识别标识符、数字、引用的字符串和各种注释样式。

    从输入流读取的每个字节都被视为一个字符,范围在 '\u0000''\u00FF' 之间。字符值用于查找该字符的五个可能属性:空白字母数字字符串引号注释字符。每个字符都可以有零个或多个这样的属性。

    另外,一个实例还有四个标志。这些标志指示:

    • 行结束符是作为标记返回,还是被视为仅用于分隔标记的空白。
    • 是标识还是跳过 C 样式注释。
    • 是标识还是跳过 C++ 样式注释。
    • 是否将标识符的字符转换为小写字母。

    典型的应用程序首先构造此类的一个实例,建立一个语法表,然后重复循环,调用该循环的每个迭代中的 nextToken 方法,直到返回值 TT_EOF

59、StringReader

  • 自1.1开始有
  • 继承Reader
  • 其源为一个字符串的字符流

60、StringWriter

  • 自1.1开始有
  • 继承Writer
  • 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。关闭 StringWriter 无效。此类中的方法在关闭该流后仍可被调用,而不会产生任何 IOException

61、Writer

  • 抽象类
  • 自1.1开始有
  • 实现Appendable, Closeable, Flushable
  • 写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

三、异常

62、CharConversionException

  • 类、异常
  • 自1.1开始有
  • 继承IOException
  • 用于字符转换异常的基类。

63、EOFException

  • 类、异常
  • 自1.0开始有
  • 继承IOException
  • 当输入过程中意外到达文件或流的末尾时,抛出此异常。此异常主要被数据输入流用来表明到达流的末尾。注意,其他许多输入操作返回一个特殊值表示到达流的末尾,而不是抛出异常。

64、FileNotFoundException

  • 类、异常
  • 自1.0开始有
  • 继承IOException
  • 当试图打开指定路径名表示的文件失败时,抛出此异常。在不存在具有指定路径名的文件时,此异常将由 FileInputStreamFileOutputStreamRandomAccessFile 构造方法抛出。如果该文件存在,但是由于某些原因不可访问,比如试图打开一个只读文件进行写入,则此时这些构造方法仍然会抛出该异常。

65、InterruptedIOException

  • 类、异常
  • 自1.0开始有
  • 继承IOException
  • I/O 操作已中断信号,抛出此异常。抛出 InterruptedIOException 指示输入或输出传输已经终止,原因是执行此操作的线程中断。字段 bytesTransferred 指示在发生中断之前已成功传输了多少字节。

66、InvalidClassException

  • 类、异常
  • 自1.1开始有
  • 继承ObjectStreamException
  • 当 Serialization 运行时检测到某个类具有以下问题之一时,抛出此异常。

    • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
    • 该类包含未知数据类型
    • 该类没有可访问的无参数构造方法

67、InvalidObjectException

  • 类、异常
  • 自1.1开始有
  • 继承ObjectStreamException
  • 指示一个或多个反序列化对象未通过验证测试。该参数应该提供失败的原因。

68、IOException

  • 类、异常
  • 自1.0开始有
  • 继承Exception
  • 当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类。

69、NotActiveException

  • 类、异常
  • 自1.1开始有
  • 继承ObjectStreamException
  • 当序列化和反序列化不活动时,抛出此异常。

70、NotSerializableException

  • 类、异常
  • 自1.1开始有
  • 继承ObjectStreamException
  • 当实例需要具有序列化接口时,抛出此异常。序列化运行时或实例的类会抛出此异常。参数应该为类的名称。

71、ObjectStreamException

  • 类、异常
  • 自1.1开始有
  • 继承IOException
  • 当实例需要具有序列化接口时,抛出此异常。序列化运行时或实例的类会抛出此异常。参数应该为类的名称。

72、OptionalDataException

  • 类、异常
  • 自1.1开始有
  • 继承ObjectStreamException
  • 指示对象读取操作失败的异常,原因是无法读取流中的基本数据或已序列化对象的数据末尾。以下两种情况都可能抛出此异常:

    • 流中下一个元素是基本数据时试图读取对象。在这种情况下,OptionalDataException 的 length 字段设置成了可从流中直接读取的基本数据的字节数,而 eof 字段设置成了 false。
    • 试图使用类定义的 readObject 或 readExternal 方法读取数据末尾的后面。在这种情况下,OptionalDataException 的 eof 字段设置成了 true,而 length 字段设置成了 0。

73、StreamCorruptedException

  • 类、异常
  • 自1.1开始有
  • 继承ObjectStreamException
  • 当从对象流中读取的控制信息与内部一致性检查相冲突时,抛出此异常。

74、SyncFailedException

  • 类、异常
  • 自1.1开始有
  • 继承IOException
  • 当 sync 操作失败时,抛出此异常。

75、UnsupportedEncodingException

  • 类、异常
  • 自1.1开始有
  • 继承IOException
  • 不支持字符编码。

76、UTFDataFormatException

  • 类、异常
  • 自1.0开始有
  • 继承IOException
  • 在数据输入流中或由实现该数据输入接口的任何类中以 UTF-8 修改版格式读取错误字符串时,抛出此异常。有关读取和写入 UTF-8 修改版字符串的格式,请参阅 DataInput 类的描述。

77、WriteAbortedException

  • 类、异常
  • 自1.1开始有
  • 继承ObjectStreamException
  • 在写入操作过程中抛出 ObjectStreamException 之一的信号。在写入操作过程中抛出 ObjectStreamExceptions 之一时,在读取操作过程中将抛出此异常。终止写入的异常可在详细信息字段中找到。该流被重置为初始状态,而且对已经反序列化的对象的所有引用都被丢弃。

    从版本 1.4 开始,已对此异常作出改进,以符合通用异常链机制。在构造时提供并通过公共 detail 字段访问的“导致中止的异常”现在称为 cause,并可通过 Throwable.getCause() 方法以及前述的“遗留字段”访问。