Java中使用renameTo方法导致文件数据缺失
开发的时候发现了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方法导致文件数据缺失相关推荐
- java中三种方法_Java文件I/O的三种方法
Java文件I/O的三种方法 RandomAccessFile是不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(Data ...
- Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法
public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...
- Java file类中的renameTo方法
renameTo方法 public boolean renameTo(File dest),File类中的renameTo方法可以操作文件或目录. 1. 操作文件 1.1 在同一目录下操作 1.重命名 ...
- 浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- java中构造方法和方法全面解析
java中构造方法和方法全面解析 我相信大多说人都对构造方法.方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望 ...
- JAVA中list.contains()方法,要重写equals(),hashcode()方法
今天动力节点java培训机构小编为大家介绍"JAVA中list.contains()方法,要重写equals(),hashcode()方法",希望能够帮助正在学习java的零基础学 ...
- jAvA中deprecate,在Java中使用Deprecated方法或类是错误的吗?
1.在Java中使用Deprecated方法或类是错误的吗? 从已弃用的定义 : 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者是因为存在更好的selec ...
- JAVA中的flush()方法
JAVA中的flush()方法 首先先看一段代码: out.flush(); out.close() 这在我以前的代码里有所体现,但是只知道这是清空缓冲区的作用,但是不知道具体什么是缓冲区,以及为什么 ...
- java中的native方法性能到底怎么样?
前言 java中的native方法性能到底怎么样? 第一次写博客,如果写的不好,望见谅,烦请指出问题,虚心学习 先说结论,native 方法性能不如java方法 一.native方法? 主要是java ...
最新文章
- 漫画 | 理解了TCP连接的实现以后,客户端的并发也爆发了!
- 邮箱的创建及配置:Exchange2003系列之二
- 华为服务器怎么查看系统日志,服务器运行日志查看
- 【算法的时间复杂度和空间复杂度】-算法02
- 什么时候出python4_Python4要来了?快来看看Python之父怎么说
- 哲学家就餐问题python_Python实现哲学家就餐问题实例代码
- java mouseenter_关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
- iPhone 12 Pro/Pro Max最新渲染图曝光
- SpringMvc JavaMailSenderImpl 邮件发送时到时前端无法接受Json数据问题解决
- 2018年终总结以及未来展望
- HTML+CSS+JS制作炫酷特效代码
- Matlab实现图像识别(一)
- 元宇宙,风口还是扯淡?
- PFPLD 人脸关键点检测
- 微信小程序云开发(云数据库的使用)
- HTML学生个人网站作业设计:动漫网站设计——蜡笔小新(3页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
- mac 下 Parallels Desktop 克隆虚拟机 product_uuid 相同
- matlab表示网络,Matlab绘制网络
- gif动态图如何制作?
- 原始经纬度转百度地图定位并显示地理位置
热门文章
- fw150rm刷openwrt固件_交作业 - 入坑J1900 软路由(刷原版OpenWrt 更新单线多拨)
- 新浪爱问免积分下载---
- 【项目申报】关于组织申报江苏省2022年度高新技术企业的通知
- 虚拟机IntelTV-x禁用解决方法(如何进入BIOS状态)
- Android Git忽略文件未生效的解决方案
- priority_queue 自定义Comp类
- JQuery写农场的小游戏
- unity3D台球游戏之球杆围着白球旋转瞄准目标 ***
- Eclipse报错:java.lang.ClassNotFoundException: Contex
- JAVA之Lambda表达式详解