File操作 - RandomAccessFile使用详解

简介: File操作 - RandomAccessFile使用详解

【1】RandomAccessFile基本概念


RandomAccessFile主要完成随机读取的功能,可以读取指定位置的内容。不属于InputStream和OutputStream类系的。


实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能。


它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同


20181123105239493.png


RandomAccessFile的工作方式


把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法。


比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。


此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。

————————————————

需要注意的是,它不支持只写文件。


只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。


BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。

public class RandomAccessFile implements DataOutput, DataInput, Closeable {
  //...
}

RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件。

  • 支持只访问文件的部分内容;
  • 可以向已存在的文件后追加内容;


记录指针

RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile 类对象可以自由移动记录指针:

long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到 pos 位置
long

构造器

public RandomAccessFile(File file, String mode) 
public RandomAccessFile(String name, String mode)



创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 。

RandomAccessFile 的访问模式(mode):

r: 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新


【2】文件的读写与复制

实例代码如下:

  @Test
  public void testRandomAccessFile(){
    RandomAccessFile rFile1 = null;
    RandomAccessFile rFile2 = null;
    try {
      /*相对于项目路径--contextPath路径*/
      File file1 = new File("test1.txt");
      File file2 = new File("test3.txt");
      /* rw 读写模式*/
      rFile1 = new RandomAccessFile(file1, "rw");
      rFile2 = new RandomAccessFile(file2, "rw");
      int len = 0;
      byte[] b = new byte[1024];
      /*--读入到byte数组并进行输出--*/
      while ((len = rFile1.read(b)) !=-1) {
        System.out.println("ASCII :"+len+"value :"+new String(b,0,len));//new String() turn to be String
        /*写入到另一个文件*/
        rFile2.write(b, 0, len);
      }
    }catch (IOException e) {
      e.printStackTrace();
    }
  }


【3】输出文件的大小

test1.txt文件内容:123456我们要有梦想

System.out.println(rFile1.length());



24bytes—24个字节


【4】跳到指定位置读取文件

seek(long a)是定位文件指针在文件中的位置。

参数a确定读写位置距离文件开头的字节个数,比如seek(0)就是定位文件指针在开始位置,其是绝对定位。

rFile1.seek(1);//从第二个字节开始

实例代码如下:

  RandomAccessFile raf = new RandomAccessFile(“test.txt”, “rw”);
    raf.seek(5);
  byte [] b = new byte[1024];
  int off = 0;
  int len = 5;
  raf.read(b, off, len);
  String str = new String(b, 0, len);
  System.out.println(str);
  raf.close();

【5】跳过指定字节

skipBytes()是指在文件中跳过给定数量的字节,其是相对定位。

目录
相关文章
|
8月前
|
存储 Java
文件IO之 File 类和 InputStream, OutputStream 的用法(一)
文件IO之 File 类和 InputStream, OutputStream 的用法
55 0
|
8月前
|
索引
文件IO之 File 类和 InputStream, OutputStream 的用法(三)
文件IO之 File 类和 InputStream, OutputStream 的用法
63 0
|
5月前
|
Java
File操作-InputStream/OutputStream及是否创建文件
File操作-InputStream/OutputStream及是否创建文件
51 0
|
5月前
File操作-FileReader(FileWriter)/BufferedReader(Writer)
File操作-FileReader(FileWriter)/BufferedReader(Writer)
26 0
|
8月前
|
Java
文件IO之 File 类和 InputStream, OutputStream 的用法(二)
文件IO之 File 类和 InputStream, OutputStream 的用法
59 0
FILE
FILE
90 0
|
网络协议 测试技术 Go
带缓冲的 Reader 读文件 | 学习笔记
快速学习带缓冲的 Reader 读文件
99 0
带缓冲的 Reader 读文件 | 学习笔记
|
存储 Java
RandomAccessFile用法
RandomAccessFile用法
|
存储 索引
RandomAccessFile详解
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。
1506 0
new RandomAccessFile有时很耗时间
new RandomAccessFile有时很耗时间
120 0