精华内容
下载资源
问答
  • Java对txt文件内容的增删该查操作

    千次阅读 2019-04-05 10:12:45
    在之前文章中介绍了怎样java中实现对txt文档的读取和写入的操作,并且可以通过保存为json格式方便数据的使用,但是如果需要对txt中的数据修改或删除操作,通常的做法是通过读取操作,将所有的数据读取出来放在一个...

    在之前文章中介绍了怎样在java中实现对txt文档的读取和写入的操作,并且可以通过保存为json格式方便数据的使用,但是如果需要对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;
        }
    

    在第5行中创建RandomAccessFile对象时,需要传入指定的modle,该modle包含四种方式,如下所示:

    • “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.读取

    读取操作与本文提到的之前bufferedReader.readLine()方式,基本相同,但我们通过设置RandomAccessFile为"r"方式,可以减少内存和cpu的消耗,且读取速度较快。

    同样在读取操作时,我们不仅可以指定读取方式为逐行读取,也可以使用readUTF()方式避免中文乱码;也支持对8种基本数据类型的读取。

     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. 增加

    在添加操作中已经提到可以通过修改point的方式,在指定位置增加数据,但是该操作会影响到增加数据后面的数据,例如之前的数据为"abcdefg",在"c"后增加"123",则修改后的数据则为"abc123g",因此如果不影响之前的数据,需要通过以下操作:

    • 通过文件流,先将之前的数据缓存起来;
    • 在指定位置增加新的数据;
    • 将之前文件流缓存的数据,重写添加到文件中。
    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.修改

    对于文件中已有的内容需要进行修改操作,可以通过修改RandomAccessFile位置的方式实现,但是该方式操作起来比较复杂,且需要详细计算位置参数,本文中建议使用String的split方法,将包含需要替换的数据分隔后,替换操作,流程如下:

    • 逐行读取文件,判断是否包含需要替换的内容;
    • 查找到需要替换的内容后,使用split方法,将该行分隔;
    • 移动RandomAccessFile的位置至行首,先写入分隔前部分的内容,再写入替换的内容,最后写入分隔后部分的内容。
     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();
            }
        }
    

    5.删除

    删除的操作与修改类似,只是将修改的内容至为空,即可。

    6.小结

    本文首先简介了RandomAccessFile类,重点介绍了其“指针”的概念和读取操作的模式等。通过实际样例代码和流程分析,详细讲解了通过RandomAccessFile类实现了增删改查的操作。

    展开全文
  • 加密模块主要执行的内容是生成一个新文件,然后读取原文件的字节,进行减一,写到新文件。主要代码如下: 解密模块主要执行的内容是生成加密前的文件,然后读取加密文件的字节,进行加一,写到加密前的文件。主要...

    加密磁盘某一目录的所有文件

    本文章采用的加密算法是对文件的所有字节进行减一处理。
    对目录文件进行加密主要的难点是对目录进行遍历,那怎样进行遍历?
    本文章采用递归的方法,先判断根目录下的文件是不是目录,是的话进行递归,不是的话进行加密,再把原文件删除,主要代码如下:
    在这里插入图片描述
    加密模块主要执行的内容是生成一个新文件,然后读取原文件的字节,进行减一,写到新文件。主要代码如下:
    在这里插入图片描述
    解密模块主要执行的内容是生成加密前的文件,然后读取加密文件的字节,进行加一,写到加密前的文件。主要代码如下:
    在这里插入图片描述
    执行测试:对D:\cs下所有文件进行加密
    执行结果:
    在这里插入图片描述
    在这里插入图片描述
    还原后缀名也无法读取
    在这里插入图片描述然后进行解密:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    后记:对目录遍历的方法还可以采取广度遍历,如建立一个队列,将根目录入队, 循环判断队列长度是否为0,是的话退出,不是则将队列的目录出队,出队的目录下的子目录入队,文件则进行加密。

    展开全文
  • Redis 主从架构是怎样的? Redis 持久化有哪几种方式?不同持久化机制都有什么优缺点?持久化机制具体底层是如何实现? Redis 集群模式工作原理能说一下么?在集群模式下,Redis key 是如何寻址?...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    学生提问:图11.15和图11.16显示的所有按钮都紧挨在一起,如果希望像FlowLayout、GridLayout等布局管理器指定组件间距该怎么办? 397 11.4 AWT 常用组件 398 11.4.1 基本组件 398 11.4.2 对话框 400 11.5 事件...
  • java面试宝典

    2013-02-28 16:04:01
    154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、对一个JSP页,如果多个客户端同时请求它,同步可能吗? 37 156、在jsp:useBean语法中使用beanName有何好处? 37 157、当我使用时,在...
  • java怎样使用库中文件(import 文件) JAVA专业术语集 JB4中文教程 Jbuider4新特性介绍 Jbuilder4.0 使用心得 JBuilder5 Weblogic 6.0 安装配置全攻略 JBuilder 4 概观 JBUILDER 5新增功能介绍 jBuiler 4...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,... Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() ...
  • 2.1.3 数据结构的内容 2.1.4 数据结构的分类 2.1.5 数据结构的几种存储方式 2.1.6 数据类型 2.1.7 常用的数据结构 2.1.8 选择合适的数据结构解决实际问题 2.2 线性表 2.2.1 什么是线性表 2.2.2 线性表的基本运算 2.3...
  • 2.1.3 数据结构的内容 16 2.1.4 数据结构的分类 18 2.1.5 数据结构的几种存储方式 18 2.1.6 数据类型 19 2.1.7 常用的数据结构 20 2.1.8 选择合适的数据结构解决实际问题 21 2.2 线性表 21 2.2.1 什么是...
  • 10、下列说法中,不属于数据模型所描述的内容的是()。 A、数据结构 B、数据操作 C、数据查询 D、数据约束 我的答案:A 11、若按功能划分,软件测试的方法通常分为白盒测试方法和(黑盒测试方法)。 12、...
  • 他最热衷是逻辑与物理数据库设计、 数据库与Java应用程序集成、查询优化器,以及与性能管理和优化相关的所有方面。他还是Trivadis性能团队和OakTable 网站核心成员。.  童家旺 安徽芜湖人。毕业于上海电力...
  • 摘要 目前,学校工作繁杂、资料重多,管理...当SUN公司1995年正式以Java这个名字推出的时候,几乎所有的WEB开发人员都想到:噢,这正是我想要的。于是Java成了一颗耀眼的明星,丑小鸭一下了变成了白天鹅。 1.4.3 编码
  • ant1.9资源

    2014-11-13 06:56:00
    同时在antstudy工程的根目录下建立build.xml文件,在该文件中编译src目录下的java文件,并将编译后的class文件放入build/classes目录中,在编译前,需清除classes目录,该文件的内容如下: ...
  •  本书涵盖了android开发从概念、技术到市场推广应用全部话题,内容包括:android概览、android应用程序设计精髓、android用户界面设计精髓、常用android api、更多android应用程序设计原则、对外发布你android...
  • asp.net知识库

    2015-06-18 08:45:45
    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、对一个JSP页,如果多个客户端同时请求它,同步可能吗? 37 156、在jsp:useBean语法中使用beanName有何好处? 37 157、当我使用时,在...
  • 3.4.5 显示文件的内容 38 3.4.6 比较文件 38 3.4.7 理解操作系统和Shell变量 38 3.4.8 UNIX中的输入和输出重定向 41 3.4.9 防止文件被覆盖 41 3.5 UNIX中文件和目录的浏览 42 3.5.1 UNIX系统中的文件 ...
  • 4.2.8 如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。 4.2.9 请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。 4.3.0 深拷贝和浅拷贝区别。 ...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    不要试图使用所有的符号 根据项目开发的不同阶段,用正确的观点来画类图 不要为每个事物都画一个模型,应该把精力放在关键的领域 对象图 对象图 表示在某一时刻类的具体实例和这些实例之间的具体连接关系 ...
  • 9.2.4 为什么用所有这些组类型 106 9.2.5 内置全局域组 108 9.2.6 通用组 108 9.2.7 创建、使用和删除域组 109 9.3 从混合模式更改到自然模式结果 111 9.3.1 更改组作用域 112 9.3.2 从混合模式到自然模式...
  • 健康档案管理系统.RAR

    热门讨论 2010-03-16 21:40:14
    详细调查的内容涉及到组织功能的多个方面,可大致归纳为9类问题: ① 组织机构和功能业务; ② 组织目标和发展战略; ③ 工艺流程和产品构成; ④ 数据与数据流程; ⑤ 业务流程与工作形式; ⑥ 管理方式和具体业务...
  • ASP EXCEL导入SQL

    2013-01-23 01:17:24
     所有的请求都是统一通过RESTAPI进行相应的资源与服务的请求,这样就能够保证系统提供的服务都是解耦的,极大的简化了系统,从而改善了系统的交互性和可重用性,同时也能够根据业务进行相应统一且透明的内存缓存 ...
  • 所有的经验都源于你犯过的错误) Don't be one of the leeches. (不要当伸手党) Either outstanding or out. (要么出众,要么出局) Day01~15 - Python语言基础 Day01 - 初识Python Python简介 - Python...
  • 只要我们的水平足够的高,所有的代码都在那里,我们就可以修改和定制软件,以适合我们的需要;如果Windows开放源代码,并以GPL发布,一样是有人能造出来N多的Windows发行版;遗憾的是 Windows并不是开源系统; 所以...
  • 第二行代码得到class 为container的div元素,第三行代码得到标签下面id为msg的div元素(不过最好别这样写,因为jQuery需要遍历所有的div元素,对于带id的元素,直接用$("#id"))。第四行代码得到context为上下文的table...
  • ASP200问.EXE

    2010-05-20 13:25:08
    159.如何打印Iframe中的内容 160.如何用ASP实现网络打印 161.如何用组件实现本地特定打印 162.如何在ASP程序中打印Excel报表 163.如何在ASP中调用Java类 164.如何在线压缩和解压缩WinRAR文件 第11章 综合开发 166....

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

怎样删除java所有的内容

java 订阅