JavaFile实现对文件txt内容的增删该查操作

简介: JavaFile实现对文件txt内容的增删该查操作

有的是直接读取替换后再全部写入,如果文件很大快乐很容易啪就没了。

但是如果需要对txt中的数据修改或删除操作,通常的做法是通过读取操作,将所有的数据读取出来放在一个临时的变量中,例如String中,但是如果数据量比较少则这样操作没有问题,但是一旦数据量比较大,例如需要对5G的数据进行删除操作,则会存在内存不足的情况。

因此在对于数据的删除和修改操作时,建议使用RandomAccessFile来实现,由于其特有的处理方式,在读取和写入操作时,使用该类操作仍然可以提高操作效率。

RandomAccessFile类继承自Object,实现了Closeable、DataInput和DataOutput,没有继承字节流或字符流中的任何一个类,通过DataInput和DataOutput可以方便读写操作,且效率较高。

 

1.写入

public boolean addFile(String filePath,String data) {
        RandomAccessFile rFile = null;
        try {
            File file = new File(filePath);
            rFile = new RandomAccessFile(file, "rw");//读取文件
            long point = rFile.length();
            rFile.seek(point);// 到达文件尾
            rFile.writeBytes(data + "\r\n");
            /*rFile.writeUTF(data + "\r\n");
            rFile.writeInt(2);*/
            rFile.close();
        } catch (Exception e) {
            return false;
        } 
        return true;
    }
  • r":只读方式打开,如果调用任何方式的write时,会抛出IOException;
  • "rw":读写方式,如果该文件不存在,则尝试创建该文件;
  • "rws":读写方式,相比较"rw",该方式要求对文件的内容或元数据的每个更新都同步写入到底层存储设备;
  • "rwd":读写方式,相比较"rw",该方式要求对文件内容的每个更新都同步至底层存储设备。

在第8行中写入的操作是通过writeBytes方式实现,其实RandomAccessFile的写入操作不仅包含对于字节的写入操作,还包括例如9行writeUTF对于字符串的写入,该方式的写入默认采用"UTF-8"的方式,因此不必担心中文乱码的问题,同时还支持对8中基本数据类型的操作。

以上操作是将数据直接写入至文件的末尾位置,实现数据的追加添加,仔细观察上述的代码的第6和7行,在第6行中通过length()方法获取当前文件所有的字节数,通过seek(int)方法跳转至文件末尾的位置,该操作有点类似C语言中的指针概念,即通改变指针指向的位置,修改存储的数据内容,默认新创建时位于0的位置。

因此,我们可以借助该方法修改指定位置的数据,前提是我们知道欲修改数据的位置,如下示例代码:

 

rFile.seek(point-NUM);                      //如果已知欲插入的位置,可以直接跳转至插入点
byte[] ch = new byte[LINE_NUM];     //定义欲插入数据的字节数
String str = new String(ch);            //初始化 使用空行占位
rFile.seek(point);                              //重新回到之前文件的末尾位置
rFile.writeBytes(data);                     //写入需要插入的数据

2.读取

 public String readLine(String filePath) {
        StringBuilder stContent = null;
        RandomAccessFile rFile = null;
        if (new File(filePath).exists()) {
            try {
                stContent = new StringBuilder();
                rFile = new RandomAccessFile(filePath, "r");
                String line = null;
                //rFile.readUTF();
                //rFile.readInt();
                while (null != (line = rFile.readLine())) {//循环遍历
                    stContent.append(line);
                }
                rFile.close();
            } catch (Exception e) {
                //异常处理
                LogUtils.i("e "+e.toString());
            }
        }
        return stContent.toString();
    }

3. 增加

public static void insert(long pos, String content) {
        File tempFile = null;
        try {
            tempFile = File.createTempFile("temp", null);
            //在虚拟机终止时,请求删除此抽象路径名表示的文件或目录
            tempFile.deleteOnExit();
            FileOutputStream fos = new FileOutputStream(tempFile);
            RandomAccessFile raf = new RandomAccessFile(filePath, "rw");
            raf.seek(pos);
            byte[] buffer = new byte[4];
            int num = 0;
            while (-1 != (num = raf.read(buffer))) {
                fos.write(buffer, 0, num);
            }
            raf.seek(pos);
            raf.writeBytes(content);
            FileInputStream fis = new FileInputStream(tempFile);
            while (-1 != (num = fis.read(buffer))) {
                raf.write(buffer, 0, num);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4.修改

 public static void change(String oldStr,String newStr){
        try {
            RandomAccessFile raf = new RandomAccessFile(filePath, "rw");
            String line;
            while (null!=(line=raf.readLine())) {
                if(line.contains(oldStr)){
                    String[] split = line.split(oldStr);
                    raf.seek(split[0].length());
                    raf.writeBytes(newStr);
                    raf.writeBytes(split[1]);
                }
            }
           raf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


相关文章
|
小程序 JavaScript 算法
开源轻量级 IM 框架 MobileIMSDK 的微信小程序端已发布!
MobileIMSDK - 微信小程序端是一套基于微信原生 WebSocket 的即时通讯库:
405 0
|
存储 缓存 索引
字典是怎么扩容的?它会经历哪些过程?
字典是怎么扩容的?它会经历哪些过程?
163 3
|
运维 安全 API
"揭秘阿里云无影:如何颠覆传统IT,引领未来云计算趋势的神秘力量?"
【8月更文挑战第21天】近年来,云计算深刻改变了企业的IT架构与运营模式。作为国内领先云服务商,阿里云推出的无影云电脑成为创新典范。无影是一种无需实体形态的计算服务,用户可通过终端随时随地访问云端资源。通过帮助大型制造企业实现IT基础设施统一管理、降低运维成本、保障数据安全等,以及支持初创企业低成本快速构建IT环境、按需调整资源、提高工作效率,无影展现了简化IT、提高安全性、灵活资源调配及移动办公等未来云计算趋势。
294 0
|
缓存 负载均衡 安全
探索API接口开发(定制与开发接口)
在当今数字化、互联互通的时代,API(应用程序编程接口)已经成为连接不同软件、服务和应用的关键桥梁。API接口开发,作为软件架构和系统设计的重要组成部分,不仅影响着数据交换的效率,更决定了整个系统的灵活性和可扩展性。本文将深入探讨API接口开发的各个方面,包括其重要性、开发流程、最佳实践以及面临的挑战。
|
供应链 Python
Demand Forecasting模型解释与Python代码示例
Demand Forecasting模型解释与Python代码示例
|
监控 安全 关系型数据库
稳定性之故障应急处理流程
尽管可以通过稳定性体系建设,来避免出现生产系统故障。但是仍然无法彻底避免一点风险都不会产生,当稳定性风险产生后,怎么快速协调组织,缩短故障时长,科学的流程呢?
稳定性之故障应急处理流程
|
消息中间件 canal Java
实时计算 Flink版产品使用问题之parallelism数量是否必须要小于slot数量
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
设计模式 架构师 程序员
DDD洋葱架构才是 yyds!阿里大牛手记(DDD)领域驱动设计应对之道
虽然身为架构师,设计一个高质量的架构依然是复杂与困难的。 简单来说,动用大量的资源只为了一套优质的三高架构并不正确,而是该在了解当前业务现状的情况下,创造出灵活、可维护、健硕能成长的。
IT:银行类金融科技岗笔试习题集合—各大行(工商+建设+农业+浦发+招商+平安+人民+邮政银行)计算机信息科技岗笔试集合(包括计算机基础知识+网络+操作系统+数据库系统原理)
IT:银行类金融科技岗笔试习题集合—各大行(工商+建设+农业+浦发+招商+平安+人民+邮政银行)计算机信息科技岗笔试集合(包括计算机基础知识+网络+操作系统+数据库系统原理)
IT:银行类金融科技岗笔试习题集合—各大行(工商+建设+农业+浦发+招商+平安+人民+邮政银行)计算机信息科技岗笔试集合(包括计算机基础知识+网络+操作系统+数据库系统原理)
|
Shell Linux Unix
du 使用详解 linux查看目录大小 linux统计目录大小并排序 查看目录下所有一级子目录文件夹大小 du -h --max-depth=1 |grep [
常用命令 du -h --max-depth=1 |grep [TG] |sort   #查找上G和T的目录并排序 du -sh    #统计当前目录的大小,以直观方式展现   du -h --max-depth=1 |grep 'G' |sort   #查看上G目录并排序 du -sh ...
9208 0