RandomAccessFile
public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable
随机访问文件类最大的特点是可以随机访问文件,对指定的文件位置进行读写
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;
输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;
输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。
getFilePointer
public long getFilePointer()
throws IOException
返回此文件中的当前偏移量。
返回:
到此文件开头的偏移量(以字节为单位),在该位置发生下一个读取或写入操作。
抛出:
IOException - 如果发生 I/O 错误。
seek
public void seek(long pos)
throws IOException
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。偏移量的设置可能会超出文件末尾。偏移量的设置超出文件末尾不会改变文件的长度。只有在偏移量的设置超出文件末尾的情况下对文件进行写入才会更改其长度。
参数:
pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。
抛出:
IOException - 如果 pos 小于 0 或者发生 I/O 错误。
由于实现了DataInput/DataOutput接口,RandomAccessFile可以 读写JAVA的基本类型
writeUTF
writeUTF
public final void writeUTF(String str)
throws IOException
使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。首先,把两个字节从文件的当前文件指针写入到此文件,类似于使用 writeShort 方法并给定要跟随的字节数。此值是实际写出的字节数,而不是该字符串的长度。在该长度之后,按顺序输出该字符串的每个字符,并对每个字符使用 UTF-8 修改版编码。
指定者:
接口 DataOutput 中的 writeUTF
参数:
str - 要写入的字符串。
抛出:
IOException - 如果发生 I/O 错误。
readUTF
public final String readUTF()
throws IOException从此文件读取一个字符串。该字符串已使用 UTF-8 修改版格式进行编码。
从当前文件指针开始读取前两个字节,此值给出已编码字符串中随后的字节数,而不是结果字符串的长度。随后的字节然后解释为 UTF-8 修改版格式的字节编码字符,并转换为字符。
在读取了所有字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。
指定者:
接口 DataInput 中的 readUTF
返回:
一个 Unicode 字符串。
抛出:
EOFException - 如果在读取所有字节之前此文件已到达末尾。
IOException - 如果发生 I/O 错误。
UTFDataFormatException - 如果这些字节不表示 Unicode 字符串的有效 UTF-8 修改版编码。
skipBytes
public int skipBytes(int n)
throws IOException尝试跳过输入的 n 个字节以丢弃跳过的字节。
此方法可能跳过一些较少数量的字节(可能包括零)。这可能由任意数量的条件引起;在跳过 n 个字节之前已到达文件的末尾只是其中的一种可能。此方法从不抛出 EOFException。返回跳过的实际字节数。如果 n 为负数,则不跳过任何字节。
指定者:
接口 DataInput 中的 skipBytes
参数:
n - 要跳过的字节数。
返回:
跳过的实际字节数。
RandomAccessFile读写基本类型:
package io.randomaccessfile; import java.io.*; public class RandomAccessFileDemo { public static void main(String[] args) throws Exception { RandomAccessFile file = new RandomAccessFile("file", "rw"); // 以下向file文件中写数据 file.writeInt(20);// 占4个字节 file.writeDouble(8.236598);// 占8个字节 file.writeUTF("这是一个UTF字符串");// 这个长度写在当前文件指针的前两个字节处,可用readShort()读取 file.writeBoolean(true);// 占1个字节 file.writeShort(395);// 占2个字节 file.writeLong(2325451l);// 占8个字节 file.writeUTF("又是一个UTF字符串");// 首先,把两个字节从文件的当前文件指针写入到此文件,类似于使用 writeShort // 方法并给定要跟随的字节数。此值是实际写出的字节数,而不是该字符串的长度。在该长度之后,按顺序输出该字符串的每个字符,并对每个字符使用 // UTF-8 修改版编码。 file.writeFloat(35.5f);// 占4个字节 file.writeChar(‘a‘);// 占2个字节 file.seek(0);// 把文件指针位置设置到文件起始处 // 以下从file文件中读数据,要注意文件指针的位置 System.out.println("——————从file文件指定位置读数据——————"); System.out.println(file.readInt()); System.out.println(file.readDouble()); System.out.println(file.readUTF()); file.skipBytes(3);// 将文件指针跳过3个字节,本例中即跳过了一个boolean值和short值。 System.out.println(file.readLong()); int strSize = file.readShort(); file.skipBytes(strSize); // // 跳过文件中“又是一个UTF字符串”所占字节,注意readShort()方法会移动文件指针,所以不用加2。 System.out.println(file.readFloat()); System.out.println(file.readChar()); //---------------复制操作------------------- System.out.println("——————文件复制(从file到fileCopy)——————"); file.seek(0); RandomAccessFile fileCopy = new RandomAccessFile("fileCopy", "rw"); int onceReadLen = 1024; byte []buff = new byte[onceReadLen]; int len=0; while((len=file.read(buff))!=-1) { fileCopy.write(buff, 0, len); } file.close(); fileCopy.close(); System.out.println("复制完成!"); } } 输出:
——————从file文件指定位置读数据——————
20
8.236598
这是一个UTF字符串
2325451
35.5
a
——————文件复制(从file到fileCopy)——————
复制完成!
RandomAccessFile 的一个应用是 多线程下载文件