注意:
1、不能用一个RandomAccessFile对象既进行读取文件又进行写入文件,RandomAccessFile相当于管道,不能再一个管道中既进行输入又进行输出。
2、在写入(输入)文件时,若文件不存在则自动创建该文件。若写入时文件存在并且文件中有内容,则会对文件从头进行覆盖其内容。若原文件中内容很长,写入文件内容很短,则只会覆盖原文件部分内容。
public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable该类的实例支持读取和写入随机访问文件。 随机访问文件的行为类似于存储在文件系统中的大量字节。 有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 写入隐式数组的当前端的输出操作会导致扩展数组。 文件指针可以通过读取getFilePointer方法和由设置seek方法。
在这个类中的所有读取例程通常都是如果在读取所需的字节数之前到达文件结尾,则抛出一个EOFException (这是一种IOException )。 如果任何字节由于除文件末尾之外的任何原因而无法读取,则抛出IOException以外的EOFException 。 特别地,如果流已经被关闭,则可以抛出IOException 。
构造方法
构造方法和描述RandomAccessFile(File file, String mode)创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。
RandomAccessFile(String name, String mode)创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。
mode参数(文件读写形式):r、rw、rws,rwd
如果模式是 "r",但给定的字符串不表示现有的常规文件,或者如果模式以 "rw"开头,但给定的字符串不表示现有的可写的常规文件,并且无法创建该名称的新常规文件,或者在打开或创建文件时出现其他错误
SecurityException - 如果存在安全管理员,并且其 checkRead方法拒绝对该文件的读取访问或模式为“rw”,并且安全管理器的 checkWrite方法拒绝对文件的写入访问
方法
参数和类型方法和描述voidclose()关闭此随机访问文件流并释放与流相关联的任何系统资源。
FileChannelgetChannel()返回与此文件关联的唯一的FileChannel对象。
FileDescriptorgetFD()返回与此流关联的不透明文件描述符对象。
longgetFilePointer()返回此文件中的当前偏移量。
longlength()返回此文件的长度。
intread()从该文件读取一个字节的数据。
intread(byte[] b)从该文件读取最多 b.length字节的数据到字节数组。
intread(byte[] b, int off, int len)从该文件读取最多 len个字节的数据到字节数组。
booleanreadBoolean()从此文件读取一个 boolean 。
bytereadByte()从此文件中读取一个带符号的八位值。
charreadChar()从此文件中读取一个字符。
doublereadDouble()从此文件读取 double 。
floatreadFloat()从此文件读取一个 float 。
voidreadFully(byte[] b)从此文件读取 b.length字节到字节数组,从当前文件指针开始。
voidreadFully(byte[] b, int off, int len)从此文件中读取 len个字节到字节数组,从当前文件指针开始。
intreadInt()从该文件读取一个带符号的32位整数。
StringreadLine()从此文件中读取下一行文本。
longreadLong()从该文件中读取一个带符号的64位整数。
shortreadShort()从此文件中读取一个已签名的16位数字。
intreadUnsignedByte()从此文件中读取一个无符号的八位数字。
intreadUnsignedShort()从该文件中读取一个无符号的16位数字。
StringreadUTF()从该文件读取字符串。
voidseek(long pos)设置文件指针偏移,从该文件的开头测量,发生下一次读取或写入。
voidsetLength(long newLength)设置此文件的长度。
intskipBytes(int n)尝试跳过 n字节的输入丢弃跳过的字节。
voidwrite(byte[] b)从指定的字节数组写入 b.length个字节到该文件,从当前文件指针开始。
voidwrite(byte[] b, int off, int len)从指定的字节数组写入 len个字节,从偏移量 off开始写入此文件。
voidwrite(int b)将指定的字节写入此文件。
voidwriteBoolean(boolean v)将 boolean写入文件作为一个字节值。
voidwriteByte(int v)将 byte写入文件作为单字节值。
voidwriteBytes(String s)将字符串作为字节序列写入文件。
voidwriteChar(int v)将 char写入文件作为两字节值,高字节为先。
voidwriteChars(String s)将一个字符串作为字符序列写入文件。
voidwriteDouble(double v)双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,然后写入该 long值到该文件作为一个八字节的数量,高字节。
voidwriteFloat(float v)浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入该 int值到该文件作为一个四字节数量,高字节。
voidwriteInt(int v)将 int写入文件为四个字节,高字节 int 。
voidwriteLong(long v)将 long写入文件为八个字节,高字节为先。
voidwriteShort(int v)将 short写入文件作为两个字节,高字节优先。
voidwriteUTF(String str)以机器无关的方式使用 modified UTF-8编码将字符串写入文件。
例如
package com.test; import java.io.*; public class Main10 { private static final long serialVersionUID = 423758L; public static void main(String[] args) throws IOException, ClassNotFoundException { File file = new File("config-mybatis/1/44"); //输入流 RandomAccessFile randomAccessFile = new RandomAccessFile(file,"rw"); randomAccessFile.writeUTF("仅覆盖以暗示法规"); randomAccessFile.close(); //输出流 RandomAccessFile randomAccessFile1 = new RandomAccessFile(file,"rw"); System.out.println(randomAccessFile1.readUTF()); randomAccessFile.close(); } }
