IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Java IO RandomAccessFile -> 正文阅读

[移动开发]Java IO RandomAccessFile

?写在前面?

🧭Java IO流学习
🎉 内容回顾
Java IO流介绍及文件操作
Java IO字节流
Java IO字符流
Java IO节点流和处理流
Java IO对象处理流以及序列化
📢今天我们进行 Java IO RandomAccessFile 的学习,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!!
??如果觉得博主文章还不错,可以👍三连支持?一下哦😀
请添加图片描述

Java IO RandomAccessFile

RandomAccessFile

1. RandomAccessFile是IO体系中功能最丰富的文件内容访问类,即可以读取文件内容,也可以向文件中写入内容。而其他的流都是有方向,要么是读取的流,要么是写操作的流
2. RandomAccessFile的程序可以 直接跳到文件的任意位置来读取和写入内容 ,该对象的文件记录指针位于文件头(在0位置),当读/写n个字节后,文件记录指针也会向后移动n个字节,除此之外,RandomAccessFile可以自由移动指针,即可以向前,也可以向后

构造函数

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

RandomAccessFile构造函数有两个参数,其中第一个参数都是表示文件路径或者File实例。第二个参数指定的是mode,该参数是用来指定RandomAccessFile的访问模式,有 4 种值

  • “r” 以只读方式来打开指定文件夹。如果试图对该RandomAccessFile执行写入方法,都将抛出IOException异常。
  • “rw” 以读,写方式打开指定文件。如果该文件尚不存在,则试图创建该文件。
  • “rws” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容或元数据的每个更新都同步写入到底层设备。
  • “rwd” 以读,写方式打开指定文件。相对于”rw”模式,还要求对文件内容每个更新都同步写入到底层设备。

特殊的方法

1. 返回文件指针的位置

long getFilePointer();

2. 将文件指针移动到指定的pos文件 pos <= length()

void seek(long pos);

从指定位置读取文件

读取电脑磁盘上 letter.txt 文件,从文件中第3个字符开始读取,文件路径: e:\Java\letter.txt
在这里插入图片描述
代码示例:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileTest01 {
    public static void main(String[] args) {
        String pathFile = "e:\\Java\\letter.txt";
        RandomAccessFile randomAccessFile = null;

        try {
            randomAccessFile = new RandomAccessFile(pathFile, "r"); // r 只读模式
            //移动文件记录指针的位置
            randomAccessFile.seek(3);

            byte[] bytes = new byte[4];
            int readLength = 0;

            while ((readLength = randomAccessFile.read(bytes)) != -1) {
                System.out.print(new String(bytes,0,readLength));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {//关闭流
            try {
                if (randomAccessFile != null) {
                    randomAccessFile.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:
在这里插入图片描述
🚀解读:
代码示例中以 只读模式 创建了RandomAccessFile对象,此时只能读取文件内容,而不能写入。又因为调用了seek(3)方法,把文件指针的偏移量移动到3的位置,也就是从3字节开始读取数据。
在这里插入图片描述

向文件中追加内容

向电脑磁盘上 letter.txt 文件的末尾追加“Java”内容,文件路径: e:\Java\letter.txt
在这里插入图片描述
代码示例:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileTest02 {
    public static void main(String[] args) {
        String pathFile = "e:\\Java\\letter.txt";

        RandomAccessFile randomAccessFile = null;

        try {
            randomAccessFile = new RandomAccessFile(pathFile,"rw");
            long length = randomAccessFile.length();
            randomAccessFile.seek(length);//将文件指针偏移量移动到最后
            randomAccessFile.write("Java".getBytes());//写进数据
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {//关闭流
            try {
                if (randomAccessFile != null) {
                    randomAccessFile.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:
在这里插入图片描述

向文件指定位置插入内容

向电脑磁盘上 letter.txt 文件中字母c后追加“Java”内容,文件路径: e:\Java\letter.txt。因为直接插入会把字母c后的内容覆盖,所以我们先把字母c后的内容读取出来保存在一个临时文件中,待内容追加完成后,再次把临时文件中的内容写入原文件后。
在这里插入图片描述
代码示例:

import java.io.*;

public class RandomAccessFileTest {
    public static void main(String[] args) throws IOException {
        String path = "e:\\Java\\letter.txt";
        int index = 3;
        String content = "Java";
        appendContent(path,index,content);
    }

    /**
     * 往文件中指定位置写入内容
     * @param path :指定文件
     * @param index :指定文件中位置
     * @param content :追加的内容
     */
    public static void appendContent(String path,Integer index, String content) {
        File file = new File(path);
        if (!file.exists()) {
            System.out.println("文件不存在");
            return;
        }

        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(file,"rws");//创建读写模式创建RandomAccessFile对象

            //检验插入位置合法性
            if (index > raf.length()) {
                System.out.println("插入位置越界");
                return;
            }

            //创建临时文件
            File tempFile = File.createTempFile("temp", null);

            //程序退出时删除临时文件
            tempFile.deleteOnExit();

            RandomAccessFile tempRaf = new RandomAccessFile(tempFile,"rw");

            //移动指针偏移量到指定位置
            raf.seek(index);

            //把原文件index后的内容读取出来存储到临时文件中
            byte[] bytes = new byte[100];
            int readLen = 0;
            while((readLen = raf.read(bytes)) != -1) {
                tempRaf.write(bytes,0,readLen);
            }

            //让文件指针再次移动到指定位置
            raf.seek(index);

            //将追加内容写入
            raf.write(content.getBytes());

            //移动临时文件中的指针偏移量到0
            tempRaf.seek(0);

            //将临时文件中的内容写入原文件
            while((readLen = tempRaf.read(bytes)) != -1) {
                raf.write(bytes,0,readLen);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {//关闭流
            if (raf != null) {
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:
在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:19:09  更:2022-03-17 22:20:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 18:34:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码