文件批量简单操作,及相关异常记录

文件处理常用

这是我的第一篇博客
从很久之前就在纠结要不要开始写一下博客,因为之前做了很多有意思的项目,后来慢慢的换别的项目,发现之前做的东西几乎忘的块一干二净了,要是重新拿起来需要重新看才可以。
这回记录一下比较有意思的简单的地方希望能够帮助到其他人,也能够对于自己的项目重构起到一定的帮助
因为最近在做一些文件处理的批量,所以第一篇文章就写一下,最近文件处理遇到的问题还有常用的方法吧

1.描述
对于文件处理来说,刚接触还是有一点迷茫的,所以第一件事就是看之前“过来人”做过的批量任务,然后问一些比较疑惑的地方,
之后就是模拟写一个简单的,编码这个东西写的多了自然感觉也就来了,然后就是遇到不会的地方就百度,当然这只是我的方式,重点还是平时多看

2.基础部分
首先定义对应的日志用于打印输出

private static Logger logger= LoggerFactory.getLogger(FileUseController.class);

创建文件夹

File file1 =new File("");
file.mkdir();

创建文件

File file2 = new File("");
file2.createNewFile(); 

对于文件夹下的文件进行获取(常规属性,名称路径等)

File file3 = new File("D:/文件处理");
        File[] fileList = file3.listFiles();
        for(File file : fileList){
            logger.info(file.getName());
            logger.info(file.getAbsolutePath());
            logger.info(file.getParent());
            logger.info(String.valueOf(file.exists()));
            ....还有很多属性,具体使用那个看你了~
        }

读文件

FileUtils.readFileToString("文件名""格式"

FileUtils.readFileToString("file1""utf-8"

写文件

FileUtils.writeStringToFile("文件名",“内容”,"格式",“是否保留原有内容”)
//默认最后一个参数不填为false,及不保留原有数据,写文件的时候直接把原有内容删除,写入新的内容
即
FileUtils.writeStringToFile(file1,“哈哈哈,这是写进去的内容”,"utf-8"true)
FileUtils.writeStringToFile(file1,“哈哈哈,这是写进去的内容,覆盖原有内容”,"utf-8"

使用:

File file = new File("D:/文件处理/影像文件处理/简单文件/2.txt"); //读取文件的位置
File file = new File("D:/文件处理/影像文件处理/简单文件/3.txt"); //写入文件的位置
        try {
            String abc=FileUtils.readFileToString(file,"utf-8");
            logger.info("查询出来文件中 数据为:"+abc);
            FileUtils.writeStringToFile(file1,def,"utf-8");
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("对于string 进行文件写入的时候异常,异常原因为 :【{}】",e.getMessage());
        }

3.遇到的异常情况分析

1.NUL 在使用网上拿来的copy方法后,有时候复制后的文件中会出现NUL,原因是每次进行写文件的时候,把读过来的文件保存起来,
如果不足规定的字节数会自动补齐,补的时候有时候就会出现NUL问题

原来代码:

   File afile= new File(file);
            File bfile=new File(toFile); //定义一个复制后的文件路径
            bfile.createNewFile();//新建文件
            input=new FileInputStream(afile);//定义FileInputStream对象
            output=new FileOutputStream(bfile);//定义FileOutputStream对象
            byte[] date=new byte[512];//定义一个byte数组
            int i=0;
            while((i=input.read(date))>0){//判断有没有读取到文件末尾
                output.write(date);//写数据
            }
            input.close();//关闭流
            output.close();//关闭流

解决方式:(百度后)
新代码:

   File afile= new File(file);
            File bfile=new File(toFile); //定义一个复制后的文件路径
            bfile.createNewFile();//新建文件
            input=new FileInputStream(afile);//定义FileInputStream对象
            output=new FileOutputStream(bfile);//定义FileOutputStream对象
            byte[] date=new byte[512];//定义一个byte数组
            int i=0;
            while((i=input.read(date))>0){//判断有没有读取到文件末尾
                output.write(date,0,i);//写数据   !!! 这个地方是改的地方 每次写文件的时候写入读到的长度
            }
            input.close();//关闭流
            output.close();//关闭流

2.对于文件进行加压后,文件锁定问题
原因1:
1.文件在加压的时候是先读原有文件,然后加上密匙对于文件进行写操作,
所以常常会出现流关闭异常的情况,也就是你开了多少流最后少关了或者关闭的顺序不对
解决办法:
检查加压之后对应的流信息,是否都关闭了以及关闭的顺序是否正确
检查文件中开启和关闭的流的顺序是否是一样的,遵循先开后关

原因2:
对于内存信息在使用后,内存没有有效的回收,导致被占用

	finally {
			if(null != cipherOutputStream) {
				cipherOutputStream.close();
			}
			if(null != byteArrayOutputStream) {
				byteArrayOutputStream.close();
			}
			if(null != inputStream) {
				inputStream.close();
			}
			if(null != zipOutputStream) {
				zipOutputStream.close();
			}
			if(null != outputStream) {
				outputStream.close();
			} ```

(2)在方法的最后加上system.gc() 提醒jvm应该主动回收内存
```java
	finally {
			if(null != cipherOutputStream) {
				cipherOutputStream.close();
			}
			if(null != byteArrayOutputStream) {
				byteArrayOutputStream.close();
			}
			if(null != inputStream) {
				inputStream.close();
			}
			if(null != zipOutputStream) {
				zipOutputStream.close();
			}
			if(null != outputStream) {
				outputStream.close();
			}
			//提醒jvm回收对应内存
			System.gc();		

在方法的最后加上System.gc();

3.在处理文件的时候,合作方给多个文件处理(批量多文件处理)
原因:因为使用这个批量的框架只有最近才用,所有对于文件处理不是特别熟悉,没有人处理过多文件,百度了一下有方法不过需要改很多的地方,时间紧任务重(要上线了)
解决:因为给的是多个txt文件,所以转变一下方式,既然框架只提供了读一个文件的方式,那就在读文件之前把多个txt合成为一个本地的txt文件之后完成处理
(这个不是异常情况,只是自己在使用中用的方法写出来记录一下)
实际应该后续还是看一下对应的处理多文件的方法

总结:
这个只是自己在做的时候遇到的一些问题,之后百度看了很多,自己做一下简单的记录,如果有人发现有重复的地方涉及到侵权了可以和我说,之后会留上你的博客,或者有人发现错误的地方,希望您及时指出,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值