小编上次文件丢失电脑硬盘分区删了格式化了文件如何恢复,硬盘数据恢复后,找回的文件最后一行有NUL字符,想着怎么去掉,因为文件很多,就写了个java处理程序,处理掉NUL部分主要参考java删除文本文件最后一行为NUL的字符,这里介绍的是删除最后一样,但是考虑到我的文件最后一样有正确文本和NUL掺杂的情况,于是对代码做了一些修改。
有这样的:

也有这样的

好在NUL字符都在文件末尾,恢复后这些文件都变成了ANSI编码,小编当时写的时候是UTF-8编码


import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.stream.Stream;public class DelNul {// static String src = "E:\\abc\\";static String src = "E:\\abc\\";// 路径最后必须带/static long maxDateTime = dateToStamp("2022-02-21 00:00:00");public static void main(String args[]) throws Exception {processDirMain();//processFile();}public static void processFile() {File strFile = new File("E:\\abc\\consumer-rules.pro");// DateUtils.stampToDate(strFile.lastModified());if (strFile.exists() && strFile.lastModified() < maxDateTime) {delNulEndFile(strFile);} else {System.out.println("不符合");}}public static boolean isNeedProcessDir(File strFile) {if(strFile == null || !strFile.exists() || !strFile.isDirectory() ) {return false;}String fileNme = strFile.getName();if (strFile.isHidden()//||strFile.equals("out")//||strFile.equals("build") //||strFile.startsWith(".")|| fileNme.equals(".gradle")|| fileNme.equals(".idea")|| fileNme.equals("build")//||strFile.equals(".settings")|| fileNme.equals(".metadata")) {System.err.println(strFile.getAbsolutePath()+"不处理");return false;} else {return true;}}public static boolean isNeedProcessFile(File strFile) {if (strFile == null || !strFile.exists() || !strFile.isFile()) {return false;}String fileNme = strFile.getName();if (strFile.lastModified() >= maxDateTime || strFile.isHidden() || fileNme.endsWith(".rar")|| fileNme.endsWith(".zip") || fileNme.endsWith(".7z") || fileNme.endsWith(".gz")|| fileNme.endsWith(".rpm")|| fileNme.endsWith(".exe") || fileNme.endsWith(".doc")|| fileNme.endsWith(".jar") || fileNme.endsWith(".aar") || fileNme.endsWith(".so")) {System.err.println(strFile.getAbsolutePath() + "不处理");return false;} else {return true;}}public static void processDirMain() throws IOException {File filesrc = new File(src);if (!filesrc.exists()) {System.out.println("目标文件不存在!");return;}File[] file = filesrc.listFiles();if (file == null) {System.out.println("目录为空");return;}System.out.println("******开始处理******");java.util.Date now = new java.util.Date();java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss");// 可以方便地修改日期格式String hehe = dateFormat.format(now);System.out.println(hehe);for (int i = 0; i < file.length; i++) {System.out.println(file[i].getName() + "      开始处理!");if (isNeedProcessFile(file[i])) {delNulEndFile(file[i]);System.out.println(file[i].getName() + "        文件处理完成!" + "这是第" + i + "个,共" + file.length);} // file[i].getPath().indexOf("/.") == -1else if (isNeedProcessDir(file[i])) {System.out.println(file[i].getName() + "       目录开始处理!");String sourceDir = src + File.separator + file[i].getName();processDirectiory(sourceDir);System.out.println(file[i].getName() + "         目录处理完成!" + "这是第" + i + "个,共" + file.length);}}System.out.println("############全部处理结束!############");java.util.Date now2 = new java.util.Date();java.text.SimpleDateFormat dateFormat2 = new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss");// 可以方便地修改日期格式String hehe2 = dateFormat2.format(now2);System.out.println(hehe2);}public static void processDirectiory(String sourceDir) throws IOException {File[] file = (new File(sourceDir)).listFiles();for (int i = 0; i < file.length; i++) {if (isNeedProcessFile(file[i])) {File sourceFile = file[i];delNulEndFile(sourceFile);} else if (isNeedProcessDir(file[i])) {String dir1 = sourceDir + File.separator + file[i].getName();System.out.println(dir1 + "开始处理");processDirectiory(dir1);}}}/*** https://www.cnblogs.com/baby123/p/12706280.html* * @param fileName* @throws Exception*/public static void delNulEndFile(File srcfile) {Executors.newCachedThreadPool().execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubif(srcfile == null || !srcfile.exists()) {System.err.println("delNulEndFile error");return;}System.out.println(srcfile.getAbsolutePath());try {RandomAccessFile file = new RandomAccessFile(srcfile, "rw");long len = file.length();if (len == 0) {System.err.println("len is 0,not process");file.close();return;}long start = file.getFilePointer();long nextend = start + len - 1;int i = -1;// 移动指针file.seek(nextend);byte[] buf = new byte[1];boolean isDelete = false;while (nextend > start) {i = file.read(buf, 0, 1);// System.out.println(buf[0]);if (buf[0] != 0) {isDelete = true;}// 删除最后的NUL字符if (isDelete) {file.setLength(nextend + 1);System.out.println(srcfile.getAbsolutePath()+"...");break;}nextend--;//System.out.println(nextend);file.seek(nextend);}file.close();} catch (Exception e) {// TODO Auto-generated catch blockSystem.err.println(e);e.printStackTrace();}}});}/*** https://www.cnblogs.com/baby123/p/12706280.html* * @param fileName* @throws Exception*/public static void delNulAtLastLine(String fileName) throws Exception {RandomAccessFile file = new RandomAccessFile(fileName, "rw");long len = file.length();long start = file.getFilePointer();long nextend = start + len - 1;int i = -1;// 移动指针file.seek(nextend);byte[] buf = new byte[1];boolean isDelete = true;while (nextend > start) {i = file.read(buf, 0, 1);System.out.println(buf[0]);if (buf[0] == 0) {isDelete = true;}if (buf[0] == '\r') {// 删除最后一行if (isDelete) {file.setLength(nextend - start);}break;}nextend--;file.seek(nextend);}file.close();}
// 将时间转换为时间戳public static long dateToStamp(String s) {String res = "";// 设置时间格式,将该时间格式的时间转换为时间戳SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date;try {date = simpleDateFormat.parse(s);long time = date.getTime();//res = String.valueOf(time);System.out.println(time);return time;} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}return System.currentTimeMillis();}
}

对于大量文件的处理还是很耗时的,博主只是在处理的时候用了多线程,文件夹遍历的时候并没有使用多线程,后续有时间看看能不能优化,尽量缩短处理时间
参考
java删除文本文件最后一行为NUL的字符
Notepad++中如何替换掉NUL不可见字符【原创】

Java 程序处理 去除文件中的NUL字符相关推荐

  1. java 循环遍历字符串_Java 程序迭代遍历字符串中的每个字符

    Java 程序迭代遍历字符串中的每个字符 在本教程中,我们将学习遍历字符串的每个字符. 要理解此示例,您应该了解以下Java编程主题: 示例1:使用for循环遍历字符串的每个字符 示例class Ma ...

  2. python去重复行_python去除文件中重复的行实例

    python去除文件中重复的行,我们可以设置一个一个空list,res_list,用来加入没有出现过的字符行! 如果出现在res_list,我们就认为该行句子已经重复了,可以再加入到记录重复句子的li ...

  3. java 存储数据到文件中_本机速度文件支持的“纯” Java大数据存储

    java 存储数据到文件中 动机 所有这一切始于意识到我买不起足够大的计算机. 音频处理需要大量的内存. Audacity是一款出色的免费音频处理器,它使用文件支持的存储系统对其进行管理. 这是解决此 ...

  4. Java程序向MySql数据库中插入的中文数据变成了问号

    找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...

  5. 每个java程序都至少有一个线程给主线程,java程序在主线程中判断各个子线程状态的操作,该如何解决...

    java程序在主线程中判断各个子线程状态的操作 每个子线程在队列为空时会wait等待其他线程添加新url到队列,到最后所有子线程都取不到url时也会都wait住,要在主线程中判断如果所有的子线程都是w ...

  6. 将Java程序作成exe文件的几种方法【转载】

    看到网上有同志的介绍将Java程序作成exe文件的方法,写的不错,但是也许是这篇文章完成的时间比较早,许多内容已经不合适了.我在这里补充几条: 一.exe4j 说明:exe4j可以将Jar文件制作成e ...

  7. 将Java程序作成exe文件的几种方法

    看到网上有同志的介绍将Java程序作成exe文件的方法,写的不错,但是也许是这篇文章完成的时间比较早,许多内容已经不合适了.我在这里补充几条: 一.exe4j 说明:exe4j可以将Jar文件制作成e ...

  8. java程序阅读题6,阅读以下说明和java程序,填补代码中的空缺(1)~(6),将解答填入答题纸的对 - 信管网...

    阅读以下说明和Java程序,填补代码中的空缺(1)-(6),将解答填入答题纸的对应栏内. [说明] 很多依托扑克牌进行的游戏都要先洗牌.下面的Java代码运行时先生成一副扑克牌,洗牌后再按顺序打印每张 ...

  9. java 解除文件占用_Java如何强制删除java程序占用的文件

    在JAVA对文件的读写操作中,操作完以后将输入流和输出流及时关闭时很必要的.假如我们有时候忘记关闭了,又不知道在哪个地方去关闭,为了删除该文件,JAVA可以进行强制删除操作.可以使用如下代码进行强制删 ...

最新文章

  1. 解决chrome浏览器us-yahoo.com搜索劫持
  2. 2017年9月18日
  3. Cpp 对象模型探索 / delete 运算符内部调用过程分析
  4. 视音频编解码学习工程:FLV封装格式分析器
  5. spring的事物配置
  6. linux下的各种shell介绍(bash和dash转换)
  7. 实验吧之NSCTF misc250
  8. 初一上册计算机教案,人教版七年级上册信息技术教学计划
  9. Cisco单臂路由实验
  10. 响应式和自适应的区别
  11. 见面才是最好的沟通方式,商机都藏在聊天中
  12. 大数据案例分析|谁在愚人节最容易被骗?
  13. 我的世界如何制作一个空岛服务器,我的世界1.7.10 God 世界空岛服务器
  14. [车联网安全自学篇] Android安全之Android so文件分析「详细版」
  15. 软件项目管理思维导图(转载)
  16. 小米Max 2完美刷成开发版获得root超级权限的流程
  17. java按比例压缩图片到指定的大小(kb、mb)
  18. 为什么把人称呼为“总”?
  19. 掌握农业信息化核心 物联网助力智慧农业
  20. ARM-Linux嵌入式系统启动流程

热门文章

  1. JavaScript 解析json例子
  2. SVN如何本地拉取项目
  3. HttpRequest 介绍
  4. SQL审核 | SQLE-SQL审核平台体验报告
  5. EXCEL VBA 使用正则表达式清洗替换数据
  6. python朴素贝叶斯对wine_基于朴素贝叶斯对Wine数据集分类
  7. JavaWeb框架(二):Servlet组件入门
  8. 云平台编程与开发(一):云平台服务商一览
  9. SQL数据库可疑恢复 挂起恢复 置疑恢复 SQL数据库无法附加修复 附加报错 9003
  10. Python 趣味百题