文件处理常用
这是我的第一篇博客
从很久之前就在纠结要不要开始写一下博客,因为之前做了很多有意思的项目,后来慢慢的换别的项目,发现之前做的东西几乎忘的块一干二净了,要是重新拿起来需要重新看才可以。
这回记录一下比较有意思的简单的地方希望能够帮助到其他人,也能够对于自己的项目重构起到一定的帮助
因为最近在做一些文件处理的批量,所以第一篇文章就写一下,最近文件处理遇到的问题还有常用的方法吧
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文件之后完成处理
(这个不是异常情况,只是自己在使用中用的方法写出来记录一下)
实际应该后续还是看一下对应的处理多文件的方法
总结:
这个只是自己在做的时候遇到的一些问题,之后百度看了很多,自己做一下简单的记录,如果有人发现有重复的地方涉及到侵权了可以和我说,之后会留上你的博客,或者有人发现错误的地方,希望您及时指出,谢谢