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编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十六章的内容,这一次 ...
随机推荐
- css的双飞翼布局
双飞翼布局的大概意思就是左右两边的内容是固定的,大小是固定的, 而中间的布局的随着页面的大小变化而自动变化的. 通过代码来解析: 1.四个div,也可以使用section,其中main,left.ri ...
- spring bean 加载过程(spring)
以classpathXmlApplication为例 入口方法包含3个部分, public ClassPathXmlApplicationContext(String[] configLocation ...
- QTableWidget和 QTableView翻页效果(准确计算Scroll,然后使用setSliderPosition函数)
以QTableView举例,QTableWidget使用相同 int CQTTableViewPageSwitch::pageCount(QTableView *p)//QTableView 总页 ...
- WebBrowser执行脚本和调用外部方法
控制WebBrowser实际上就是控制IE,最简单的方法就是执行javascript或vbscript,省去了接口的转换.如何执行脚本?以前我一直用mshtml中IHTMLWindow2接口的exec ...
- python中的变量,字符串,用户交互,if语句
一:python介绍 python的创始人为吉多·范罗苏姆,创始时间是1989年. 1python是一门什么样的语言 python是一门解释型弱类型语言★ 弱类型:弱类型的变量可以变,强类型的变量不能 ...
- ChannelPipeline----贯穿io事件处理的大动脉
ChannelPipeline贯穿io事件处理的大动脉 上一篇,我们分析了NioEventLoop及其相关类的主干逻辑代码,我们知道netty采用线程封闭的方式来避免多线程之间的资源竞争,最大限度地减 ...
- 零基础搭建appium自动化环境
目录 1.关键概念 2.安装过程 2.1.安装nodejs 2.2.安装appium 2.3.安装Android SDK 2.4.安装模拟器 2.5.安装Python3 2.6.安装appium Cl ...
- Java---使用EWS 写个ExchangeMailUtil
依赖包: commons-httpclient-3.1.jar commons-codec-1.10.jar commons-logging-1.2.jar jcifs-1.3.17.jar 代码示例 ...
- Java进阶——高性能MySQL(一)
MySQL逻辑架构: 链接管理与安全性: MySQL5.5或更高版本版本提供了一个API,支持线程池(Thread-Pooling)插件,可以使用池中的少量线程来服务大量的连接. 优化与并行: MyS ...
- 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用ApplicationPart动态加载控制器和视图
标题:从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图 作者:Lamond Lu 地址:http://www.cnblogs ...