开发的时候发现了es里面数据有缺失,排查了好久,最后怀疑是renameTo方法的时候,在renameTo还没有完成的时候,程序就对生成的文件进行了处理,实际上这个时候文件还没有完全进入目标文件夹

这完全是一个偶发的问题,但是,发生的频率并不算太低,基本上每小时12个点的文件,总会有一个点出现这种情况,我并没有做完全的统计,因为总体数据量比较大。

于是我在renameTo操作后加了一个线程等待一秒钟的操作,就是为了防止出现这种文件还未转移完全的情况

并且我打印了两行日志,看一下被renameTo前后文件是不是有差异

结果果然是,renameTo前后的数据竟然相差相当大

我研究了一下renameTo的源码,发现最后是调用的native方法

private native boolean rename0(File f1, File f2);

我猜测是rename0方法是在开始执行的时候,发现文件可以移动就返回了true,而此时其实刚开始执行数据移动操作,数据移动还没有完成,理论上这种移动会很快。程序进行操作的文件,13000行的数据,也没有产生问题,为什么2000行的数据会缺失。是不是如果遇到了机器IO极大的时候,可能会影响数据的转移。在转移了部分数据之后,我的程序开始了读操作,然后就出现了不可写入的情况。剩下的数据也就不会再写入了。

但是伴随而来的就是一个问题,rename0方法到底是以什么形式进行转移文件的,未完全转移的时候是否允许对文件进行读写操作。如果允许,那么我猜测可能成立,如果不允许,我的猜测就不成立了。

我开始想调大一点sleep时间,但是每一秒对于上万个文件的处理速度都是很大的影响。我现在发现,我甚至没办法判断rename0是否完成了。

最后处理办法决定通过复制再删除的方法完成试一下,原来的renameTo换成了jdk提供的一个FileChannel的方式实现

                try {FileUtil.copyFileUsingFileChannels(backFile,backuppath);backFile.delete();}catch (Exception e){LOGGER.error("文件复制失败:"+backPath);}

copyFileUsingFileChannels方法

    public static void copyFileUsingFileChannels(File source, File dest)throws IOException {FileChannel inputChannel = null;FileChannel outputChannel = null;try {inputChannel = new FileInputStream(source).getChannel();outputChannel = new FileOutputStream(dest).getChannel();outputChannel.transferFrom(inputChannel, 0, inputChannel.size());} finally {inputChannel.close();outputChannel.close();}}

目前观察程序还没有出现缺失数据的情况,待后续观察

Java中使用renameTo方法导致文件数据缺失相关推荐

  1. java中三种方法_Java文件I/O的三种方法

    Java文件I/O的三种方法 RandomAccessFile是不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(Data ...

  2. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  3. Java file类中的renameTo方法

    renameTo方法 public boolean renameTo(File dest),File类中的renameTo方法可以操作文件或目录. 1. 操作文件 1.1 在同一目录下操作 1.重命名 ...

  4. 浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  5. java中构造方法和方法全面解析

    java中构造方法和方法全面解析 我相信大多说人都对构造方法.方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望 ...

  6. JAVA中list.contains()方法,要重写equals(),hashcode()方法

    今天动力节点java培训机构小编为大家介绍"JAVA中list.contains()方法,要重写equals(),hashcode()方法",希望能够帮助正在学习java的零基础学 ...

  7. jAvA中deprecate,在Java中使用Deprecated方法或类是错误的吗?

    1.在Java中使用Deprecated方法或类是错误的吗? 从已弃用的定义 : 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者是因为存在更好的selec ...

  8. JAVA中的flush()方法

    JAVA中的flush()方法 首先先看一段代码: out.flush(); out.close() 这在我以前的代码里有所体现,但是只知道这是清空缓冲区的作用,但是不知道具体什么是缓冲区,以及为什么 ...

  9. java中的native方法性能到底怎么样?

    前言 java中的native方法性能到底怎么样? 第一次写博客,如果写的不好,望见谅,烦请指出问题,虚心学习 先说结论,native 方法性能不如java方法 一.native方法? 主要是java ...

最新文章

  1. 漫画 | 理解了TCP连接的实现以后,客户端的并发也爆发了!
  2. 邮箱的创建及配置:Exchange2003系列之二
  3. 华为服务器怎么查看系统日志,服务器运行日志查看
  4. 【算法的时间复杂度和空间复杂度】-算法02
  5. 什么时候出python4_Python4要来了?快来看看Python之父怎么说
  6. 哲学家就餐问题python_Python实现哲学家就餐问题实例代码
  7. java mouseenter_关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
  8. iPhone 12 Pro/Pro Max最新渲染图曝光
  9. SpringMvc JavaMailSenderImpl 邮件发送时到时前端无法接受Json数据问题解决
  10. 2018年终总结以及未来展望
  11. HTML+CSS+JS制作炫酷特效代码
  12. Matlab实现图像识别(一)
  13. 元宇宙,风口还是扯淡?
  14. PFPLD 人脸关键点检测
  15. 微信小程序云开发(云数据库的使用)
  16. HTML学生个人网站作业设计:动漫网站设计——蜡笔小新(3页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  17. mac 下 Parallels Desktop 克隆虚拟机 product_uuid 相同
  18. matlab表示网络,Matlab绘制网络
  19. gif动态图如何制作?
  20. 原始经纬度转百度地图定位并显示地理位置

热门文章

  1. fw150rm刷openwrt固件_交作业 - 入坑J1900 软路由(刷原版OpenWrt 更新单线多拨)
  2. 新浪爱问免积分下载---
  3. 【项目申报】关于组织申报江苏省2022年度高新技术企业的通知
  4. 虚拟机IntelTV-x禁用解决方法(如何进入BIOS状态)
  5. Android Git忽略文件未生效的解决方案
  6. priority_queue 自定义Comp类
  7. JQuery写农场的小游戏
  8. unity3D台球游戏之球杆围着白球旋转瞄准目标 ***
  9. Eclipse报错:java.lang.ClassNotFoundException: Contex
  10. JAVA之Lambda表达式详解