Java编程思想:File类getCanonicalFile()方法,listFile()方法
import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern;
import java.io.File;
import java.io.FilenameFilter;
public class Test {
public static void main(String[] args) {
// DirectoryDemo.test();
ProcessFileTest.test();
ProcessFileTest.test2();
}
}
/*
local():产生由本地目录中的文件构成的File对象数组
walk():产生给定目录下的由整个目录书中所有文件构成的List<File>
*/
class Directory {
public static File[] local(File dir, String regex) {
return dir.listFiles(new FilenameFilter() {
Pattern pattern = Pattern.compile(regex);
@Override
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
}
});
}
public static class TreeInfo implements Iterable<File>{
public List<File> dirs = new ArrayList<>();
public List<File> files = new ArrayList<>();
public TreeInfo() {
}
public void addAll(TreeInfo infos) {
this.dirs.addAll(infos.dirs);
this.files.addAll(infos.files);
}
@Override
public Iterator<File> iterator() {
return files.iterator();
}
public String toString() {
return "dirs: " + PPrint.pformat(dirs) + "\n\nfiles:" + PPrint.pformat(files);
}
}
public static File[] local(String path, String regex) {
return local(new File(path),regex);
}
private static TreeInfo recurseDirs(File startDir, String regex) {
TreeInfo result = new TreeInfo();
for (File item : startDir.listFiles()) {
if (item.isDirectory()) {
result.dirs.add(item);
result.addAll(recurseDirs(item,regex));
} else {
//这个地方的写法和我之前看到的不太一样
if (item.getName().matches(regex)) {
result.files.add(item);
}
}
}
return result;
}
public static TreeInfo walk(String start, String regex) {
return recurseDirs(new File(start),regex);
}
public static TreeInfo walk(File start, String regex) {
return recurseDirs(start, regex);
}
public static TreeInfo walk(String start) {
return recurseDirs(new File(start), ".*");
}
}
class PPrint {
public static String pformat(Collection<?> collection) {
if (collection.size() == 0) {
return "[]";
}
StringBuilder result = new StringBuilder("[");
for (Object elem : collection) {
if (collection.size() != 1) {
result.append("\n ");
}
result.append(elem);
}
if (collection.size() != 1) {
result.append("\n");
}
result.append("]");
return result.toString();
}
public static void pprint(Collection<?> c) {
System.out.println(pformat(c));
}
public static void pprint(Object[] objects) {
System.out.println(pformat(Arrays.asList(objects)));
}
}
class DirectoryDemo {
public static void test() {
PPrint.pprint(Directory.walk(".").dirs);
}
}
/*
创建一个工具,它可以在目录中穿行,并且根据Strategy对象来处理这些目录中的文件
书中案例的逻辑:
1.针对上一个案例中walk方法计算出来的所有文件,执行一个策略方法
*/
//书中原代码:
/*
ProcessFiles的工作是:执行查找具有特定扩展名的文件的所有工作
Strategy的工作是:查找到指定的文件后,执行某个指定的算法
*/
class ProcessFiles {
public interface Strategy {
void process(File file);
}
private Strategy strategy;
private String ext;
public ProcessFiles(Strategy s,String ext){
this.strategy=s;
this.ext=ext;
}
public void processDirectoryTree(File root) throws IOException {
for (File file : Directory.walk(root.getAbsolutePath(), ".*\\." + ext)) {
strategy.process(file.getCanonicalFile());
}
}
public void start(String[] args) {
try {
if (args.length == 0) {
processDirectoryTree(new File("."));
}else{
for (String arg : args) {
File fileArg = new File(arg);
if (fileArg.isDirectory()) {
processDirectoryTree(fileArg);
}else{
if(!arg.endsWith("."+ext))
arg+="."+ext;
strategy.process(new File(arg).getCanonicalFile());
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//改进后代码
interface IStrategy{
void process(File file);
}
class ProcessFiles1 {
private IStrategy strategy;
private String ext;
public ProcessFiles1(IStrategy strategy, String ext) {
this.strategy=strategy;
this.ext=ext;
}
public void start(String[] paths){
for(String path:paths){
start(path);
}
}
public void start(String path) {
core(new File(path));
}
public void start(){
start(".");
}
private void core(File root){
if(root.isFile()){
strategy.process(root);
return;
}
for (File item : Directory.walk(root.getAbsolutePath(), ".*\\." + ext)) {
strategy.process(root);
}
return;
}
}
class ProcessFileTest {
public static void test() {
new ProcessFiles(new ProcessFiles.Strategy(){
public void process(File file) {
System.out.println(file);
}
},"java").start(new String[0]);
}
public static void test2() {
new ProcessFiles1(new IStrategy(){
public void process(File file) {
try {
System.out.println(file.getCanonicalFile());
} catch (IOException e) {
e.printStackTrace();
}
}
},"java").start();
}
}
Java编程思想:File类getCanonicalFile()方法,listFile()方法的更多相关文章
- java编程思想-复用类总结
今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...
- java基础42 File类的构造函数及其方法
本文知识点(目录): 1.IO流(Input Output) 2.IO流技术的运用场景 3.File类的构造函数(方法) 4.File类的一些常用方法 5.实例(解析File类 ...
- java编程思想-复用类(2)
如果java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本(这一点与C++不同) class Homer { char doh(char c) { ...
- java编程思想-复用类
/* 一个文件中只能有一个public类 并且此public类必须与文件名相同 */ class WaterSource { private String s; WaterSource() { Sys ...
- 33.JAVA编程思想——JAVA IO File类
33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...
- Java编程思想(四) —— 复用类
看了老罗罗升阳的专訪,不由自主地佩服,非常年轻,我之前以为和罗永浩一个级别的年龄.也是见过的不是初高中编程的一位大牛之中的一个,专訪之后.发现老罗也是一步一个脚印的人. 别说什么难做,做不了.你根本就 ...
- java 方法调用绑定--《java编程思想》学习笔记
将一个方法调用同一个方法主体关联起来,就是绑定. 绑定分两种 :前期绑定 和 后期绑定 . 绑定------------- | -----前期绑定-------编译期绑定 { static , fin ...
- Java编程思想(后)
Java编程思想(后) 持有对象 如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. Java中的库基本类型: List, Set, Queue和Map --- 称为集 ...
- JAVA编程思想——分析阅读
需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...
- 《Java编程思想》读书笔记(三)
前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...
随机推荐
- C#WeakReference弱引用
原文:C#WeakReference弱引用 弱引用:在引用对象的同时,允许垃圾回收该对象. .NET中提供了WeakReference对象来实现这个功能. 对于那些创建便宜但耗费大量内存的对象,即希望 ...
- Cookieless.js —— 无需 Cookie 实现访客跟踪
直击现场 https://github.com/Colex/node-cookieless Cookieless.js 是一个轻量级的使用 Etag 进行访客跟踪的 Node.js 扩展库.使用该库无 ...
- Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)
之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...
- windows下进程间通信的(13种方法)
转自:http://blog.csdn.NET/shiqz/article/details/5862936 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进 ...
- foreach() 中用指针指向数组元素,循环结束后最好销毁指针
之前发过一次微博,今天又遇到这个问题,并且再次犯错,于是决定再加深一下. 就举php.net里的一个例子吧 $a = array('abe','ben','cam'); foreach ($a as ...
- 最短JS判断IE6/IE7/IE8系列的写法
常用的 var isIE=!!window.ActiveXObject; var isIE6=isIE&&!window.XMLHttpRequest; var isIE8=isIE& ...
- Postman支持的几种数据类型请求方式
一.postman作为web应用开发工具,可以用于模拟多种请求方式,但是支持的传参类型又不尽相同.根据面板上的几种数据打包方式来选择合适的请求数据类型. form-data 就是http请求中的mul ...
- 软件测试入门-测试模型(V型 W型 H型)
软件测试工程师称为“QA”,质量保证者——这是入门的第一点要学习的. 首先看基本的测试模型 1.“V”型 特点:[活动串行]这是一种古老的瀑布模型,反映了实际和测试之间的关系. 局限:仅仅把测试过程作 ...
- 编解码器之战:AV1、HEVC、VP9和VVC
视频Codec专家Jan Ozer在Streaming Media West上主持了一场开放论坛,邀请百余名观众参与热门Codec的各项优势与短板.本文整理了讨论的主要成果,基本代表了AV1.HEVC ...
- 系统学习 Java IO ---- 目录,概览
Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...