文章目录

  • 简介
  • 使用java拷贝文件
  • 使用File filter
  • 总结

简介

一个linux命令的事情,小师妹非要让我教她怎么用java来实现,哎,摊上个这么杠精的小师妹,我也是深感无力,做一个师兄真的好难。

使用java拷贝文件

今天小师妹找到我了:F师兄,能告诉怎么拷贝文件吗?

拷贝文件?不是很简单的事情吗?如果你有了文件的读权限,只需要这样就可以了。

cp www.flydean.com www.flydean.com.back

当然,如果是目录的话还可以加两个参数遍历和强制拷贝:

cp -rf srcDir distDir

这么简单的linux命令,不要告诉我你不会。

小师妹笑了:F师兄,我不要用linux命令,我就想用java来实现,我不正在学java吗?学一门当然要找准机会来练习啦,快快教教我吧。

既然这样,那我就开讲了。java中文件的拷贝其实也有三种方法,可以使用传统的文件读写的方法,也可以使用最新的NIO中提供的拷贝方法。

使用传统方法当然没有NIO快,也没有NIO简洁,我们先来看看怎么使用传统的文件读写的方法来拷贝文件:

    public  void copyWithFileStreams() throws IOException{File fileToCopy = new File("src/main/resources/www.flydean.com");File newFile = new File("src/main/resources/www.flydean.com.back");newFile.createNewFile();try(FileOutputStream output = new FileOutputStream(newFile);FileInputStream input = new FileInputStream(fileToCopy)){byte[] buf = new byte[1024];int bytesRead;while ((bytesRead = input.read(buf)) > 0){output.write(buf, 0, bytesRead);}}}

上面的例子中,我们首先定义了两个文件,然后从两个文件中生成了OutputStream和InputStream,最后以字节流的形式从input中读出数据到outputStream中,最终完成了文件的拷贝。

传统的File IO拷贝比较繁琐,速度也比较慢。我们接下来看看怎么使用NIO来完成这个过程:

public  void copyWithNIOChannel() throws IOException{File fileToCopy = new File("src/main/resources/www.flydean.com");File newFile = new File("src/main/resources/www.flydean.com.back");try(FileInputStream inputStream = new FileInputStream(fileToCopy);FileOutputStream outputStream = new FileOutputStream(newFile)){FileChannel inChannel = inputStream.getChannel();FileChannel outChannel = outputStream.getChannel();inChannel.transferTo(0, fileToCopy.length(), outChannel);}}

之前我们讲到NIO中一个非常重要的概念就是channel,通过构建源文件和目标文件的channel通道,可以直接在channel层面进行拷贝,如上面的例子所示,我们调用了inChannel.transferTo完成了拷贝。

最后,还有一个更简单的NIO文件拷贝的方法:

public  void copyWithNIOFiles() throws IOException{Path source = Paths.get("src/main/resources/www.flydean.com");Path destination = Paths.get("src/main/resources/www.flydean.com.back");Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);}

直接使用工具类Files提供的copy方法即可。

使用File filter

太棒了,小师妹一脸崇拜:F师兄,我还有一个需求,就是想删除某个目录里面的以.log结尾的日志文件,这个需求是不是很常见?F师兄一般是怎么操作的?

一般这种操作我都是一个linux命令就搞定了,如果搞不定那就用两个:

rm -rf *.log

当然,如果需要,我们也是可以用java来实现的。

java中提供了两个Filter都可以用来实现这个功能。

这两个Filter是java.io.FilenameFilter和java.io.FileFilter:

@FunctionalInterface
public interface FilenameFilter {boolean accept(File dir, String name);
}
@FunctionalInterface
public interface FileFilter {boolean accept(File pathname);
}

这两个接口都是函数式接口,所以他们的实现可以直接用lambda表达式来代替。

两者的区别在于,FilenameFilter进行过滤的是文件名和文件所在的目录。而FileFilter进行过滤的直接就是目标文件。

在java中是没有目录的概念的,一个目录也是用File的表示的。

上面的两个使用起来非常类似,我们就以FilenameFilter为例,看下怎么删除.log文件:

public void useFileNameFilter(){String targetDirectory = "src/main/resources/";File directory = new File(targetDirectory);//Filter out all log filesString[] logFiles = directory.list( (dir, fileName)-> fileName.endsWith(".log"));//If no log file found; no need to go furtherif (logFiles.length == 0)return;//This code will delete all log files one by onefor (String logfile : logFiles){String tempLogFile = targetDirectory + File.separator + logfile;File fileDelete = new File(tempLogFile);boolean isdeleted = fileDelete.delete();log.info("file : {} is deleted : {} ", tempLogFile , isdeleted);}}

上面的例子中,我们通过directory.list方法,传入lambda表达式创建的Filter,实现了过滤的效果。

最后,我们将过滤之后的文件删除。实现了目标。

总结

小师妹的两个问题解决了,希望今天可以不要再见到她。

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

本文的例子https://github.com/ddean2009/learn-java-io-nio

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/io-file-copy-file-filter/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

小师妹学JavaIO之:File copy和File filter相关推荐

  1. 小师妹学JavaIO之:文件File和路径Path

    文章目录 简介 文件和路径 文件中的不同路径 构建不同的Path 总结 简介 文件和路径有什么关系?文件和路径又隐藏了什么秘密?在文件系统的管理下,创建路径的方式又有哪些?今天F师兄带小师妹再给大家来 ...

  2. 小师妹学JavaIO之:File文件系统

    文章目录 简介 文件权限和文件系统 文件的创建 代码中文件的权限 总结 简介 小师妹又遇到难题了,这次的问题是有关文件的创建,文件权限和文件系统相关的问题,还好这些问题的答案都在我的脑子里面,一起来看 ...

  3. java文件夹路径的表达_小师妹学JavaIO之:文件File和路径Path

    简介 文件和路径有什么关系?文件和路径又隐藏了什么秘密?在文件系统的管理下,创建路径的方式又有哪些?今天F师兄带小师妹再给大家来一场精彩的表演. 文件和路径 小师妹:F师兄我有一个问题,java中的文 ...

  4. 小师妹学JavaIO之:目录还是文件

    文章目录 简介 linux中的文件和目录 目录的基本操作 目录的进阶操作 目录的腰疼操作 总结 简介 目录和文件傻傻分不清楚,目录和文件的本质到底是什么?在java中怎么操纵目录,怎么遍历目录.本文F ...

  5. 小师妹学JavaIO之:用Selector来发好人卡

    文章目录 简介 Selector介绍 创建Selector 注册Selector到Channel中 SelectionKey selector 和 SelectionKey 总的例子 总结 简介 NI ...

  6. 小师妹学JavaIO之:MappedByteBuffer多大的文件我都装得下

    文章目录 简介 虚拟地址空间 详解MappedByteBuffer MapMode MappedByteBuffer的最大值 MappedByteBuffer的使用 MappedByteBuffer要 ...

  7. 小师妹学JavaIO之:NIO中Channel的妙用

    文章目录 简介 Channel的分类 FileChannel Selector和Channel DatagramChannel SocketChannel ServerSocketChannel As ...

  8. 小师妹学JavaIO之:文件系统和WatchService

    文章目录 简介 监控的痛点 WatchService和文件系统 WatchSerice的使用和实现本质 总结 简介 小师妹这次遇到了监控文件变化的问题,F师兄给小师妹介绍了JDK7 nio中引入的Wa ...

  9. 小师妹学JavaIO之:文件写入那些事

    文章目录 简介 字符输出和字节输出 格式化输出 输出其他对象 在特定的位置写入 给文件加锁 总结 简介 小师妹又对F师兄提了一大堆奇奇怪怪的需求,要格式化输出,要特定的编码输出,要自己定位输出,什么? ...

最新文章

  1. 妈呀,终于搞定VIM的复制粘贴问题了!
  2. CPU访问计算机各组件周期
  3. Linux的系统启动流程
  4. js将数组元素随机排序的方法
  5. ORA-00928: 缺失 SELECT 关键字
  6. UA STAT687 线性模型II 最小二乘理论3 广义最小二乘
  7. MySQL多元复制_MySQL多源复制解决方案
  8. OSPF协议概述(一)
  9. 信息学奥赛一本通(1239:统计数字)
  10. 居然之家完成35亿定增 小米、阿里等认购
  11. 在 Linux、 FreeBSD、 OpenBSD等UNIX操作系统 中查看 所有安装的软件或包
  12. Java 实验5 T3 将十进制转换为二进制
  13. 在VS2010 Choose Toolbox Item Dialog 中显示自定义控件
  14. 字符编码ASCII,Unicode和UTF-8
  15. Android图片添加水印
  16. SAP FI月结 坏账转移及计提准备 Doubtful Receivables Bad Debts
  17. 如何准备项目启动大会
  18. 闲情雅致-(诗词篇1)
  19. knife-4j 点击列表出现空白页怎么办?
  20. 04-0002 PCA算法

热门文章

  1. Python解析XML文件
  2. HDU2879(积性函数)
  3. delphi中的第三方控件如何安装
  4. C++中Struct和Class的区别
  5. CreatePipe匿名管道通信
  6. 重叠I/O之事件对象通知
  7. 看完这篇文章,我奶奶都懂了https的原理
  8. 新版本秒级自动部署,K8S才是永远的容器之神!
  9. Apache架构师总结的30条设计原则!
  10. 学会查看 RabbitMQ日志