这哥们既能读又能写的原理是:内部封装了字节输入流和字节输出流
用途:可是实现数据的分段写入,一个线程负责一段
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException
RandomAccessFile(File file, String mode)
创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。
RandomAccessFile(String name, String mode)
创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
通过构造函数可以看出这哥们局限性是:只能操作硬盘上的文件
而且还有模式:
创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。将创建一个新的 FileDescriptor 对象来表示此文件的连接。
mode 参数指定用以打开文件的访问模式。允许的值及其含意为:
值 含意
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
"rws" 和 "rwd" 模式的工作方式极其类似 FileChannel 类的 force(boolean) 方法,分别传递 true 和 false 参数,除非它们始终应用于每个 I/O 操作,并因此通常更为高效。如果该文件位于本地存储设备上,那么当返回此类的一个方法的调用时,可以保证由该调用对此文件所做的所有更改均被写入该设备。这对确保在系统崩溃时不会丢失重要信息特别有用。如果该文件不在本地设备上,则无法提供这样的保证。
"rwd" 模式可用于减少执行的 I/O 操作数量。使用 "rwd" 仅要求更新要写入存储的文件的内容;使用 "rws" 要求更新要写入的文件内容及其元数据,这通常要求至少一个以上的低级别 I/O 操作。
如果模式为"r" :当文件不存在时,不会自动创建,会抛出异常
如果模式为“rw”:当文件不存在时,会自动创建,当文件存在是不会覆盖
如果存在安全管理器,则使用 file 参数的路径名作为其参数调用它的 checkRead 方法,以查看是否允许对该文件进行读取访问。如果该模式允许写入,那么还使用该路径参数调用该安全管理器的 checkWrite 方法,以查看是否允许对该文件进行写入访问。
常用方法:
FileChannel getChannel()
返回与此文件关联的唯一 FileChannel 对象。
long getFilePointer()
返回此文件中的当前偏移量。
long length()
返回此文件的长度。
String readUTF()
从此文件读取一个字符串。该字符串已使用 UTF-8 修改版格式进行编码。
void seek(long pos)
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
void writeBytes(String s)
按字节顺序将该字符串写入该文件。
void writeChars(String s)
按字符顺序将该字符串写入该文件。
void writeUTF(String str)
使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。
void write(byte[] b)
将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
package newFeatures8;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo{
public static void main(String[] args) throws IOException {
//writeFile();
readFile();
}
public static void writeFile(){
try (RandomAccessFile raf=new RandomAccessFile("randomAccessFile.txt", "rw");){
raf.write("李四".getBytes());
/*
向此文件写入指定的字节,在文件中看到的是字符
只写出int类型的最低8位,也就是只写了一个字节,而int有4个字节
如果该int数字超出127 则会出现数据丢失,如何解决?
//write(int a);
使用其writeInt()方法
*/
raf.writeInt(97);
raf.write("王五".getBytes());
raf.writeInt(99);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void readFile(){
try (RandomAccessFile raf=new RandomAccessFile("randomAccessFile.txt", "r");){
//模式若为"r" 能屏蔽掉写
//调整对象中的指针,通过指针的偏移可以获取文件中的任意一段数据
//但是希望你保证这数据是有规律的
raf.seek(8);
//raf.skipBytes(8);只能往前跳
byte[] buf=new byte[4];
raf.read(buf);
int age=raf.readInt();
System.out.println("name="+new String(buf));
System.out.println("age="+age);
//new String(raf.readline().getBytes("ISO-8859-1"), "utf-8")
//System.out.println(raf.readLine());不常用,而且此方法不支持完整的 Unicode 字符集
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}