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();
        }
    }


相关文章
|
2月前
|
C#
C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录
C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录
25 0
|
12天前
|
弹性计算 运维 Shell
向文件中追加内容
【4月更文挑战第29天】
19 2
合并多个文件的内容到一个文件
合并多个文件的内容到一个文件
|
6月前
|
存储 iOS开发 C++
C++文件 I/O操作
C++文件 I/O操作
34 0
|
8月前
|
Linux 编译器 C语言
关于文件的操作
关于文件的操作
|
9月前
|
C语言 C++
对文件的各种操作详解 1
对文件的各种操作详解
|
9月前
对文件的各种操作详解 2
对文件的各种操作详解
|
9月前
|
C语言
对文件的各种操作详解 3
对文件的各种操作详解
|
Scala 开发者 索引
List 追加数据和其它使用 | 学习笔记
快速学习 List 追加数据和其它使用
320 0
|
前端开发 开发工具 计算机视觉
30行代码实现合并指定目录下的所有文件的内容
30行代码实现合并指定目录下的所有文件的内容