zoukankan      html  css  js  c++  java
  • java基础:IO流之RandomAccessFile

    简介

    RandomAccessFile,随机存取文件流,声明在java.io包下,但直接继承于java.lang.Object类。并且它实现了DatalnputDataOutput这两个接口,也就意味着这个类既可以读也可以写(既可以作为输入流,又可以作为输出流)。

    image-20210423163107694

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

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

    RandomAccessFile对象包含一个记录指针,用以标示当前读写处的位置。

    RandomAccessFile类对象可以自由移动记录指针:

    long getFilePointer():获取文件记录指针的当前位置

    void seek(long pos):将文件记录指针定位到pos位置

    基本使用

    RandomAccessFile的构造器:

    第一个参数是文件File

    第二个参数是mode模式,该参数指定RandomAccessFile的访问模式

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

    如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。

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

    使用RandomAccessFile实现文件的复制:

    try(RandomAccessFile raf = new RandomAccessFile("a.gif","r");
        RandomAccessFile raf2 = new RandomAccessFile("raf.gif","rw")){
    
        byte[] buffer = new byte[1024];
        int len;
        while((len = raf.read(buffer))!= -1){
            raf2.write(buffer, 0, len);
        }
    }catch (IOException e){
        e.printStackTrace();
    }
    

    测试写入文件:

    try(RandomAccessFile raf = new RandomAccessFile("hello.txt","rw")){
        raf.write("wj".getBytes());
    }catch (IOException e){
        e.printStackTrace();
    }
    

    源文件:

    image-20210423172315614

    测试完成后,我们发现hello.txt该文本文件只是被覆盖了前两个字符。

    所以使用RandomAccessFile作为输出流时,文件如果存在,会对原文件从头覆盖,并不是覆盖所有内容。

    image-20210423170244102

    只想在指定位置覆盖字符串:可以通过seek方法,方法参数即覆盖的开始位置

    try(RandomAccessFile raf = new RandomAccessFile("hello.txt","rw")){
        raf.seek(5);
        raf.write("wj".getBytes());
    }catch (IOException e){
        e.printStackTrace();
    }
    

    image-20210423170704428

    使用RandomAccessFile在指定位置实现插入不覆盖的效果:

    try(RandomAccessFile raf = new RandomAccessFile("hello.txt","rw")){
        raf.seek(5);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] bBuf =  new byte[20];
        int len;
        while((len = raf.read(bBuf)) != -1){
            baos.write(bBuf, 0, len);
        }
        raf.seek(5);
        raf.write("wj".getBytes());
        raf.write(baos.toByteArray());
    }catch (IOException e){
        e.printStackTrace();
    }
    

    image-20210423171208370

    此外,RandomAccessFile还可以实现更为复杂的功能,例如多线程文件断点续传等。这里不再实现。

  • 相关阅读:
    linux sysfs (2)
    微软——助您启动云的力量网络虚拟盛会
    Windows Azure入门教学系列 全面更新啦!
    与Advanced Telemetry创始人兼 CTO, Tom Naylor的访谈
    Windows Azure AppFabric概述
    Windows Azure Extra Small Instances Public Beta版本发布
    DataMarket 一月内容更新
    和Steve, Wade 一起学习如何使用Windows Azure Startup Tasks
    现实世界的Windows Azure:与eCraft的 Nicklas Andersson(CTO),Peter Löfgren(项目经理)以及Jörgen Westerling(CCO)的访谈
    正确使用Windows Azure 中的VM Role
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14694823.html
Copyright © 2011-2022 走看看