RandomAccessFile
1.基础知识
-
所属类
java.io.RandomAccessFile
-
作用:
进行文件的byte单字节读写
-
原理:
-
指针读取:
-
每写入1byte(字节),指针移动1个位置.
-
同一个raf对象指针的位置不重置为0的,如果要读取,要先raf.seek(0);
-
不同的raf默认指针位置为0再次写操作会覆盖写入的部分;
-
由于第一次写入1个String类型占3个字节,第二次写入一个int类型占2个字节,还剩余一个字节就会抛出
EOFException
异常dyte[] dates = new dates[]; String str = new String ("x","字符集"); raf.seek(); raf.writeInt(1);
-
2.相关方法
-
创建对象
如何file为r,而选择rw访问模式则直接报错
r:读:如果写操作会抛出io异常
rw:读写:如果没有文件会尝试创建文件
RamdomAccessFile raf = new RamdomAccessFile(file,"rw");
-
写入
-
char/ASCII写入
read.write();
-
写入数组大小数据并导入数组中
read.write(dates);
-
写入数组n1-n2位置数据并导入数组中
read.write(dates,n1,n2);
-
int/double/其他类型
当读取到末尾时会抛出
EOFException
raf.writeInt();/raf.writeUTF();
-
UTF
虽然传入的是String类型内容,但是写入的是不同类型(“1”–int/“你好”–String)
raf.UTF("1");/raf.UTF("你好");
-
-
读取
-
char/ASCII读取(文档不乱码)
raf.read();
-
读取数组大小数据并导入到数组中
raf.read(dates);
-
int/UTF(不乱码)读取
raf.readInt();/raf.readUTF();
-
-
指针
单位是byte(字节)
-
当前指针位置
raf.getFilePoint();
-
指定指针位置
raf.seek(0);
-
当前总指针数/文件大小
raf.length();
-
-
关闭流
raf.close();
3.案例
1.String写入或读写
-
写入
String str = "x"; byte[] bytes = str.getBytes(str,"字符集"); raf.write(bytes);
-
读取
raf.seek(0); byte[] bytes = new byte[raf.length()]; raf.read(bytes); String str = new String(bytes,"字符集");
2.ASCII和char写入或读写
-
写入
raf.write('a');/raf.write(49);
-
读取
int code = -1; while((code=raf.read()) != -1){ syso(code); }
-
Other写入或读写(readInt/readUTF)
-
写入
raf.writeInt(123);/raf.UTF("123");
-
读取
while(raf.getFilePoint != raf.length()){ raf.read(); }
-
3.文件复制
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
raf1 = new RandomAccessFile(file, "rw");
byte[] bytes = new byte[1024];
raf1.read(bytes);
raf2 = new RandomAccessFile("D:\\B.txt", "rw");
raf2.write(bytes);
System.out.println("复制成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
raf1.close();
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}