java.io

接口
异常
错误
java.lang.Object
  继承者 java.io.RandomAccessFile
所有已实现的接口:
Closeable, DataInput, DataOutput

public class RandomAccessFile
     
extends Object
implements DataOutput, DataInput, Closeable

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

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

从以下版本开始:
JDK1.0

构造方法摘要
RandomAccessFile(File file, String mode)
          创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。
RandomAccessFile(String name, String mode)
          创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
 
方法摘要
 void close()
          关闭此随机访问文件流并释放与该流关联的所有系统资源。
 FileChannel getChannel()
          返回与此文件关联的唯一 FileChannel 对象。
 FileDescriptor getFD()
          返回与此流关联的不透明文件描述符对象。
 long getFilePointer()
          返回此文件中的当前偏移量。
 long length()
          返回此文件的长度。
 int read()
          从此文件中读取一个数据字节。
 int read(byte[] b)
          将最多 b.length 个数据字节从此文件读入 byte 数组。
 int read(byte[] b, int off, int len)
          将最多 len 个数据字节从此文件读入 byte 数组。
 boolean readBoolean()
          从此文件读取一个 boolean
 byte readByte()
          从此文件读取一个有符号的八位值。
 char readChar()
          从此文件读取一个字符。
 double readDouble()
          从此文件读取一个 double
 float readFloat()
          从此文件读取一个 float
 void readFully(byte[] b)
          将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。
 void readFully(byte[] b, int off, int len)
          将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。
 int readInt()
          从此文件读取一个有符号的 32 位整数。
 String readLine()
          从此文件读取文本的下一行。
 long readLong()
          从此文件读取一个有符号的 64 位整数。
 short readShort()
          从此文件读取一个有符号的 16 位数。
 int readUnsignedByte()
          从此文件读取一个无符号的八位数。
 int readUnsignedShort()
          从此文件读取一个无符号的 16 位数。
 String readUTF()
          从此文件读取一个字符串。
 void seek(long pos)
          设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
 void setLength(long newLength)
          设置此文件的长度。
 int skipBytes(int n)
          尝试跳过输入的 n 个字节以丢弃跳过的字节。
 void write(byte[] b)
          将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
 void write(byte[] b, int off, int len)
          将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。
 void write(int b)
          向此文件写入指定的字节。
 void writeBoolean(boolean v)
          按单字节值将 boolean 写入该文件。
 void writeByte(int v)
          按单字节值将 byte 写入该文件。
 void writeBytes(String s)
          按字节序列将该字符串写入该文件。
 void writeChar(int v)
          按双字节值将 char 写入该文件,先写高字节。
 void writeChars(String s)
          按字符序列将一个字符串写入该文件。
 void writeDouble(double v)
          使用 Double 类中的 doubleToLongBits 方法将双精度参数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。
 void writeFloat(float v)
          使用 Float 类中的 floatToIntBits 方法将浮点参数转换为一个 int,然后按四字节数量将该 int 值写入该文件,先写高字节。
 void writeInt(int v)
          按四个字节将 int 写入该文件,先写高字节。
 void writeLong(long v)
          按八个字节将 long 写入该文件,先写高字节。
 void writeShort(int v)
          按两个字节将 short 写入该文件,先写高字节。
 void writeUTF(String str)
          使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

RandomAccessFile

public RandomAccessFile(String name,
                        String mode)
                 throws FileNotFoundException
创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。将创建一个新的 FileDescriptor 对象来表示到文件的连接。

mode 参数指定用以打开文件的访问模式。允许的值及其含意如 RandomAccessFile(File,String) 构造方法所指定的那样。

如果存在安全管理器,则使用 name 作为其参数调用其 checkRead 方法,以查看是否允许对该文件进行读取访问。如果该模式允许写入,那么还使用 name 作为安全管理器的参数来调用其 checkWrite 方法,以查看是否允许对该文件进行写入访问。

参数:
name - 取决于系统的文件名
mode - 此访问 mode
抛出:
IllegalArgumentException - 如果此模式参数与 "r""rw""rws""rwd" 的其中一个不相等
FileNotFoundException - 如果该模式为 "r",但给定的字符串表示一个现有的常规文件,或者该模式以 "rw" 开头,但给定的字符串不表示一个现有的可写常规文件,而且无法创建具有该名称的新常规文件,或者在打开或创建该文件时发生一些其他错误
SecurityException - 如果存在安全管理器,并且其 checkRead 方法拒绝对该文件的读取访问,或者该模式为 "rw",并且该安全管理器的 checkWrite 方法拒绝对该文件的写入访问
另请参见:
SecurityException, SecurityManager.checkRead(java.lang.String), SecurityManager.checkWrite(java.lang.String)

RandomAccessFile

public RandomAccessFile(File file,
                        String mode)
                 throws FileNotFoundException
创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。将创建一个新的 FileDescriptor 对象来表示此文件的连接。

mode 参数指定用以打开文件的访问模式。允许的值及其含意为:

含意

"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd"   打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
"rws""rwd" 模式的工作方式极其类似
FileChannel 类的 force(boolean) 方法,分别传递 truefalse 参数,除非它们始终应用于每个 I/O 操作,并因此通常更为高效。如果该文件位于本地存储设备上,那么当返回此类的一个方法的调用时,可以保证由该调用对此文件所做的所有更改均被写入该设备。这对确保在系统崩溃时不会丢失重要信息特别有用。如果该文件不在本地设备上,则无法提供这样的保证。

"rwd" 模式可用于减少执行的 I/O 操作数量。使用 "rwd" 仅要求更新要写入存储的文件的内容;使用 "rws" 要求更新要写入的文件内容及其元数据,这通常要求至少一个以上的低级别 I/O 操作。

如果存在安全管理器,则使用 file 参数的路径名作为其参数调用它的 checkRead 方法,以查看是否允许对该文件进行读取访问。如果该模式允许写入,那么还使用该路径参数调用该安全管理器的 checkWrite 方法,以查看是否允许对该文件进行写入访问。

参数:
file - 该文件对象
mode - 访问模式,如 所述
抛出:
IllegalArgumentException - 如果此模式参数与 "r""rw""rws""rwd" 的其中一个不相等
FileNotFoundException - 如果该模式为 "r",但给定的文件对象不表示一个现有的常规文件,或者该模式以 "rw" 开头,但给定的文件对象不表示一个现有的可写常规文件,而且无法创建具有该名称的新常规文件,或者在打开或创建该文件时发生一些其他错误
SecurityException - 如果存在安全管理器,并且其 checkRead 方法拒绝对该文件的读取访问,或者该模式为 "rw",并且该安全管理器的 checkWrite 方法拒绝对该文件的写入访问
另请参见:
SecurityManager.checkRead(java.lang.String), SecurityManager.checkWrite(java.lang.String), FileChannel.force(boolean)
方法详细信息

getFD

public final FileDescriptor getFD()
                           throws IOException
返回与此流关联的不透明文件描述符对象。

返回:
与此流关联的不透明文件描述符对象。
抛出:
IOException - 如果发生 I/O 错误。
另请参见:
FileDescriptor

getChannel

public final FileChannel getChannel()
返回与此文件关联的唯一 FileChannel 对象。

返回通道的 java.nio.channels.FileChannel#position()position 将始终等于 getFilePointer 方法返回的此对象的文件指针偏移量。显式或者通过读取或写入字节来更改此对象的文件指针偏移量将更改通道的位置,反之亦然。通过此对象更改此文件的长度将更改通过文件通道看到的长度,反之亦然。

返回:
与此文件关联的文件通道
从以下版本开始:
1.4

read

public int read()
         throws IOException
从此文件中读取一个数据字节。以整数形式返回此字节,范围在 0 到 255 ( 0x00-0x0ff)。如果尚无输入可用,将阻塞此方法。

尽管 RandomAccessFile 不是 InputStream 的子类,但此方法的行为与 InputStreamInputStream.read() 方法完全一样。

返回:
下一个数据字节,如果已到达文件的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误。如果已到达文件的末尾,则不抛出此异常。

read

public int read(byte[] b,
                int off,
                int len)
         throws IOException
将最多 len 个数据字节从此文件读入 byte 数组。在至少一个输入字节可用前,此方法一直阻塞。

尽管 RandomAccessFile 不是 InputStream 的子类,但此方法的行为与 InputStreamInputStream.read(byte[], int, int) 方法完全一样。

参数:
b - 读入数据的缓冲区。
off - 写入数据的数组 b 中的初始偏移量。
len - 读取的最多字节数。
返回:
读入缓冲区的总字节数,如果由于已到达文件的末尾而不再有数据,则返回 -1
抛出:
IOException - 如果由于文件结束之外的某种原因不能读取第一个字节,或者随机访问文件已关闭,或者发生其他 I/O 错误。
NullPointerException - 如果 bnull
IndexOutOfBoundsException - 如果 off为负, len 为负,或者 len 大于 b.length - off

read

public int read(byte[] b)
         throws IOException
将最多 b.length 个数据字节从此文件读入 byte 数组。在至少一个输入字节可用前,此方法一直阻塞。

尽管 RandomAccessFile 不是 InputStream 的子类,但此方法的行为与 InputStreamInputStream.read(byte[]) 方法完全一样。

参数:
b - 将数据读入的缓冲区。
返回:
读入缓冲区的总字节数,如果由于已到达此文件的末尾而不再有数据,则返回 -1
抛出:
IOException - 如果由于文件结束之外的某种原因不能读取第一个字节,或者随机访问文件已关闭,或者发生其他 I/O 错误。
NullPointerException - 如果 bnull

readFully

public final void readFully(byte[] b)
                     throws IOException
b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。在读取到请求数量的字节之前,此方法将从该文件重复读取。在读取了请求数量的字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readFully
参数:
b - 将数据读入的缓冲区。
抛出:
EOFException - 如果在读取所有字节之前此文件已到达末尾。
IOException - 如果发生 I/O 错误。

readFully

public final void readFully(byte[] b,
                            int off,
                            int len)
                     throws IOException
将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。在读取到请求数量的字节之前,此方法将从该文件重复读取。在读取了请求数量的字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readFully
参数:
b - 读入数据的缓冲区。
off - 数据的初始偏移量。
len - 要读取的字节数。
抛出:
EOFException - 如果在读取所有字节之前此文件已到达末尾。
IOException - 如果发生 I/O 错误。

skipBytes

public int skipBytes(int n)
              throws IOException
尝试跳过输入的 n 个字节以丢弃跳过的字节。

此方法可能跳过一些较少数量的字节(可能包括零)。这可能由任意数量的条件引起;在跳过 n 个字节之前已到达文件的末尾只是其中的一种可能。此方法从不抛出 EOFException。返回跳过的实际字节数。如果 n 为负数,则不跳过任何字节。

指定者:
接口 DataInput 中的 skipBytes
参数:
n - 要跳过的字节数。
返回:
跳过的实际字节数。
抛出:
IOException - 如果发生 I/O 错误。

write

public void write(int b)
           throws IOException
向此文件写入指定的字节。从当前文件指针开始写入。

指定者:
接口 DataOutput 中的 write
参数:
b - 要写入的 byte
抛出:
IOException - 如果发生 I/O 错误。

write

public void write(byte[] b)
           throws IOException
b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。

指定者:
接口 DataOutput 中的 write
参数:
b - 数据。
抛出:
IOException - 如果发生 I/O 错误。

write

public void write(byte[] b,
                  int off,
                  int len)
           throws IOException
len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。

指定者:
接口 DataOutput 中的 write
参数:
b - 数据。
off - 数据的初始偏移量。
len - 要写入的字节数。
抛出:
IOException - 如果发生 I/O 错误。

getFilePointer

public long getFilePointer()
                    throws IOException
返回此文件中的当前偏移量。

返回:
到此文件开头的偏移量(以字节为单位),在该位置发生下一个读取或写入操作。
抛出:
IOException - 如果发生 I/O 错误。

seek

public void seek(long pos)
          throws IOException
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。偏移量的设置可能会超出文件末尾。偏移量的设置超出文件末尾不会改变文件的长度。只有在偏移量的设置超出文件末尾的情况下对文件进行写入才会更改其长度。

参数:
pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。
抛出:
IOException - 如果 pos 小于 0 或者发生 I/O 错误。

length

public long length()
            throws IOException
返回此文件的长度。

返回:
按字节测量的此文件的长度。
抛出:
IOException - 如果发生 I/O 错误。

setLength

public void setLength(long newLength)
               throws IOException
设置此文件的长度。

如果 length 方法返回的文件的现有长度大于 newLength 参数,则该文件将被截短。在此情况下,如果 getFilePointer 方法返回的文件偏移量大于 newLength,那么在返回此方法后,该偏移量将等于 newLength

如果 length 方法返回的文件的现有长度小于 newLength 参数,则该文件将被扩展。在此情况下,未定义文件扩展部分的内容。

参数:
newLength - 文件的所需长度
抛出:
IOException - 如果发生 I/O 错误
从以下版本开始:
1.2

close

public void close()
           throws IOException
关闭此随机访问文件流并释放与该流关联的所有系统资源。关闭的随机访问文件不能执行输入或输出操作,而且不能重新打开。

如果此文件具有一个关联的通道,那么该通道也会被关闭。

指定者:
接口 Closeable 中的 close
抛出:
IOException - 如果发生 I/O 错误。

readBoolean

public final boolean readBoolean()
                          throws IOException
从此文件读取一个 boolean。此方法从该文件的当前文件指针开始读取单个字节。值 0 表示 false。其他任何值表示 true。在读取了该字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readBoolean
返回:
读取的 boolean 值。
抛出:
EOFException - 如果此文件已到达末尾。
IOException - 如果发生 I/O 错误。

readByte

public final byte readByte()
                    throws IOException
从此文件读取一个有符号的八位值。此方法从该文件的当前文件指针开始读取一个字节。如果读取的字节为 b,其中 0 <= b <= 255,则结果将是:
(byte)(b)
 

在读取了该字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readByte
返回:
以有符号的八位 byte 形式返回此文件的下一个字节。
抛出:
EOFException - 如果此文件已到达末尾。
IOException - 如果发生 I/O 错误。

readUnsignedByte

public final int readUnsignedByte()
                           throws IOException
从此文件读取一个无符号的八位数。此方法从此文件的当前文件指针开始读取一个字节,并返回该字节。

在读取了该字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readUnsignedByte
返回:
此文件的下一个字节,解释为一个无符号的八位数。
抛出:
EOFException - 如果此文件已到达末尾。
IOException - 如果发生 I/O 错误。

readShort

public final short readShort()
                      throws IOException
从此文件读取一个有符号的 16 位数。此方法从此文件的当前文件指针开始读取两个字节。如果按顺序读取的两个字节为 b1b2,其中两个值都在 0255之间(包含),则此结果等于:
(short)((b1 << 8) | b2)
 

在读取了这两个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readShort
返回:
此文件的下两个字节,解释为一个有符号的 16 位数。
抛出:
EOFException - 如果在读取两个字节之前此文件已到达末尾。
IOException - 如果发生 I/O 错误。

readUnsignedShort

public final int readUnsignedShort()
                            throws IOException
从此文件读取一个无符号的 16 位数。此方法从该文件的当前文件指针开始读取两个字节。如果按顺序读取的字节为 b1b2,其中 0 <= b1, b2 <= 255,则结果将等于:
(b1 << 8) | b2
 

在读取了这两个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readUnsignedShort
返回:
此文件的下两个字节,解释为一个无符号的 16 位整数。
抛出:
EOFException - 如果在读取两个字节之前此文件已到达末尾。
IOException - 如果发生 I/O 错误。

readChar

public final char readChar()
                    throws IOException
从此文件读取一个字符。此方法从该文件的当前文件指针开始读取两个字节。如果按顺序读取的字节为 b1b2,其中 0 <= b1, b2 <= 255,则结果将等于:
(char)((b1 << 8) | b2)
 

在读取了这两个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readChar
返回:
此文件的下两个字节,解释为 char
抛出:
EOFException - 如果在读取两个字节之前此文件已到达末尾。
IOException - 如果发生 I/O 错误。

readInt

public final int readInt()
                  throws IOException
从此文件读取一个有符号的 32 位整数。此方法从该文件的当前文件指针开始读取 4 个字节。如果按顺序读取的字节为 b1b2b3b4,其中 0 <= b1, b2, b3, b4 <= 255,则结果将等于:
(b1 << 24) | (b2 << 16) + (b3 << 8) + b4
 

在读取了这四个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readInt
返回:
此文件的下四个字节,解释为一个 int
抛出:
EOFException - 如果在读取四个字节之前此文件已到达末尾。
IOException - 如果发生 I/O 错误。

readLong

public final long readLong()
                    throws IOException
从此文件读取一个有符号的 64 位整数。此方法从该文件的当前文件指针开始读取八个字节。如果按顺序读取的字节为 b1b2b3b4b5b6b7b8,其中:
0 <= b1, b2, b3, b4, b5, b6, b7, b8 <=255,
 

则结果将等于:

((long)b1 << 56) + ((long)b2 << 48)
+ ((long)b3 << 40) + ((long)b4 << 32)
     + ((long)b5 << 24) + ((long)b6 << 16)
     + ((long)b7 << 8) + b8
 

在读取了这八个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readLong
返回:
此文件的下八个字节,解释为一个 long