java.lang.Object java.io.RandomAccessFile
public class RandomAccessFile
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer
方法读取,并通过 seek
方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException
(是一种 IOException
)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException
,而不是 EOFException
。需要特别指出的是,如果流已被关闭,则可能抛出 IOException
。
构造方法摘要 | |
---|---|
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 |
构造方法详细信息 |
---|
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)
public RandomAccessFile(File file, String mode) throws FileNotFoundException
File
参数指定。将创建一个新的
FileDescriptor
对象来表示此文件的连接。
mode 参数指定用以打开文件的访问模式。允许的值及其含意为:
"rws" 和 "rwd" 模式的工作方式极其类似
值
含意
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
。"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 "rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 "rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
FileChannel
类的
force(boolean)
方法,分别传递
true 和
false 参数,除非它们始终应用于每个 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)
方法详细信息 |
---|
public final FileDescriptor getFD() throws IOException
IOException
- 如果发生 I/O 错误。
FileDescriptor
public final FileChannel getChannel()
FileChannel
对象。
返回通道的 java.nio.channels.FileChannel#position()
position 将始终等于
getFilePointer
方法返回的此对象的文件指针偏移量。显式或者通过读取或写入字节来更改此对象的文件指针偏移量将更改通道的位置,反之亦然。通过此对象更改此文件的长度将更改通过文件通道看到的长度,反之亦然。
public int read() throws IOException
0x00-0x0ff
)。如果尚无输入可用,将阻塞此方法。
尽管 RandomAccessFile
不是 InputStream
的子类,但此方法的行为与 InputStream
的 InputStream.read()
方法完全一样。
-1
。
IOException
- 如果发生 I/O 错误。如果已到达文件的末尾,则不抛出此异常。
public int read(byte[] b, int off, int len) throws IOException
len
个数据字节从此文件读入 byte 数组。在至少一个输入字节可用前,此方法一直阻塞。
尽管 RandomAccessFile
不是 InputStream
的子类,但此方法的行为与 InputStream
的 InputStream.read(byte[], int, int)
方法完全一样。
b
- 读入数据的缓冲区。
off
- 写入数据的数组
b
中的初始偏移量。
len
- 读取的最多字节数。
-1
。
IOException
- 如果由于文件结束之外的某种原因不能读取第一个字节,或者随机访问文件已关闭,或者发生其他 I/O 错误。
NullPointerException
- 如果
b
为
null
。
IndexOutOfBoundsException
- 如果
off
为负,
len
为负,或者
len
大于
b.length - off
public int read(byte[] b) throws IOException
b.length
个数据字节从此文件读入 byte 数组。在至少一个输入字节可用前,此方法一直阻塞。
尽管 RandomAccessFile
不是 InputStream
的子类,但此方法的行为与 InputStream
的 InputStream.read(byte[])
方法完全一样。
b
- 将数据读入的缓冲区。
-1
。
IOException
- 如果由于文件结束之外的某种原因不能读取第一个字节,或者随机访问文件已关闭,或者发生其他 I/O 错误。
NullPointerException
- 如果
b
为
null
。
public final void readFully(byte[] b) throws IOException
b.length
个字节从此文件读入 byte 数组,并从当前文件指针开始。在读取到请求数量的字节之前,此方法将从该文件重复读取。在读取了请求数量的字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
b
- 将数据读入的缓冲区。
EOFException
- 如果在读取所有字节之前此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public final void readFully(byte[] b, int off, int len) throws IOException
len
个字节从此文件读入 byte 数组,并从当前文件指针开始。在读取到请求数量的字节之前,此方法将从该文件重复读取。在读取了请求数量的字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
b
- 读入数据的缓冲区。
off
- 数据的初始偏移量。
len
- 要读取的字节数。
EOFException
- 如果在读取所有字节之前此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public int skipBytes(int n) throws IOException
n
个字节以丢弃跳过的字节。
此方法可能跳过一些较少数量的字节(可能包括零)。这可能由任意数量的条件引起;在跳过 n
个字节之前已到达文件的末尾只是其中的一种可能。此方法从不抛出 EOFException
。返回跳过的实际字节数。如果 n
为负数,则不跳过任何字节。
n
- 要跳过的字节数。
IOException
- 如果发生 I/O 错误。
public void write(int b) throws IOException
DataOutput
中的
write
b
- 要写入的
byte
。
IOException
- 如果发生 I/O 错误。
public void write(byte[] b) throws IOException
b.length
个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
DataOutput
中的
write
b
- 数据。
IOException
- 如果发生 I/O 错误。
public void write(byte[] b, int off, int len) throws IOException
len
个字节从指定 byte 数组写入到此文件,并从偏移量
off
处开始。
DataOutput
中的
write
b
- 数据。
off
- 数据的初始偏移量。
len
- 要写入的字节数。
IOException
- 如果发生 I/O 错误。
public long getFilePointer() throws IOException
IOException
- 如果发生 I/O 错误。
public void seek(long pos) throws IOException
pos
- 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。
IOException
- 如果
pos
小于
0
或者发生 I/O 错误。
public long length() throws IOException
IOException
- 如果发生 I/O 错误。
public void setLength(long newLength) throws IOException
如果 length
方法返回的文件的现有长度大于 newLength
参数,则该文件将被截短。在此情况下,如果 getFilePointer
方法返回的文件偏移量大于 newLength
,那么在返回此方法后,该偏移量将等于 newLength
。
如果 length
方法返回的文件的现有长度小于 newLength
参数,则该文件将被扩展。在此情况下,未定义文件扩展部分的内容。
newLength
- 文件的所需长度
IOException
- 如果发生 I/O 错误
public void close() throws IOException
如果此文件具有一个关联的通道,那么该通道也会被关闭。
IOException
- 如果发生 I/O 错误。
public final boolean readBoolean() throws IOException
boolean
。此方法从该文件的当前文件指针开始读取单个字节。值
0
表示
false
。其他任何值表示
true
。在读取了该字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
DataInput
中的
readBoolean
boolean
值。
EOFException
- 如果此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public final byte readByte() throws IOException
b
,其中
0 <= b <= 255
,则结果将是:
(byte)(b)
在读取了该字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
byte
形式返回此文件的下一个字节。
EOFException
- 如果此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public final int readUnsignedByte() throws IOException
在读取了该字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
DataInput
中的
readUnsignedByte
EOFException
- 如果此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public final short readShort() throws IOException
b1
和
b2
,其中两个值都在
0
和
255
之间(包含),则此结果等于:
(short)((b1 << 8) | b2)
在读取了这两个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
EOFException
- 如果在读取两个字节之前此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public final int readUnsignedShort() throws IOException
b1
和
b2
,其中
0 <= b1, b2 <= 255
,则结果将等于:
(b1 << 8) | b2
在读取了这两个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
DataInput
中的
readUnsignedShort
EOFException
- 如果在读取两个字节之前此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public final char readChar() throws IOException
b1
和
b2
,其中
0 <= b1, b2 <= 255
,则结果将等于:
(char)((b1 << 8) | b2)
在读取了这两个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
char
。
EOFException
- 如果在读取两个字节之前此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public final int readInt() throws IOException
b1
、
b2
、
b3
和
b4
,其中
0 <= b1, b2, b3, b4 <= 255
,则结果将等于:
(b1 << 24) | (b2 << 16) + (b3 << 8) + b4
在读取了这四个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
int
。
EOFException
- 如果在读取四个字节之前此文件已到达末尾。
IOException
- 如果发生 I/O 错误。
public final long readLong() throws IOException
b1
、
b2
、
b3
、
b4
、
b5
、
b6
、
b7
和
b8
,其中:
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
在读取了这八个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
long
。