`
半人马
  • 浏览: 23083 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

小练习一则

阅读更多
JBoss Seam 1.2.1GA的发行包的src里,有一些文件中有莫名其妙的0xA0字符,本来想用shell搞定的,结果搞了半天也没有用sed弄出完整的解决方案,最后只好用Java语言写了,顺带着也练练groovy和ruby.

最初的Java代码是这样的:
java 代码
 
  1. import java.io.*;  
  2.   
  3. public class Wash {  
  4.     public static void main(String[] args) {  
  5.         File root = new File("c:/ProgramFiles/jboss-seam-1.2.1.GA/src");  
  6.         wash(new File("c:/temp/seamsrc"));  
  7.     }  
  8.   
  9.     private static void washFile(File file) throws IOException {  
  10.         String path = file.getAbsolutePath();  
  11.         System.out.println("Washing file: " + path);  
  12.         File temp = new File(path + ".bak");  
  13.         temp.createNewFile();  
  14.         FileInputStream in = new FileInputStream(file);  
  15.         FileOutputStream out = new FileOutputStream(temp);  
  16.         byte bbyte;  
  17.         boolean modified = false;  
  18.         while ((bbyte = (byte) in.read()) != -1) {  
  19.             if (bbyte != (byte0xa0) {  
  20.                 out.write(bbyte);  
  21.             } else {  
  22.                 modified = true;  
  23.             }  
  24.         }  
  25.         in.close();  
  26.         out.close();  
  27.         if (modified) {  
  28.             file.delete();  
  29.             temp.renameTo(new File(path));  
  30.         } else {  
  31.             temp.delete();  
  32.         }  
  33.     }  
  34.   
  35.     private static void washDir(File dir) throws IOException {  
  36.         for (File file : dir.listFiles()) {  
  37.             if (file.isDirectory()) {  
  38.                 washDir(file);  
  39.             } else {  
  40.                 washFile(file);  
  41.             }  
  42.         }  
  43.     }  
  44. }  
想了想washFile和washDir可以合并,于是refactor了一下,成为这样
java 代码
 
  1. import java.io.*;  
  2.   
  3. public class Wash {  
  4.     public static void main(String[] args) {  
  5.         wash(new File("c:/ProgramFiles/jboss-seam-1.2.1.GA/src"));  
  6.     }  
  7.   
  8.     private static void wash(File file) {  
  9.         if (file.isFile()) {  
  10.             String path = file.getAbsolutePath();  
  11.             System.out.print("Washing file: " + path+" ...");  
  12.             File temp = new File(path + ".bak");  
  13.             FileInputStream in = null;  
  14.             FileOutputStream out = null;  
  15.             boolean modified = false;  
  16.   
  17.             try {  
  18.                 temp.createNewFile();  
  19.                 in = new FileInputStream(file);  
  20.                 out = new FileOutputStream(temp);  
  21.                 byte bbyte;  
  22.                 while ((bbyte = (byte) in.read()) != -1) {  
  23.                     if (bbyte != (byte0xa0) {  
  24.                         out.write(bbyte);  
  25.                     } else {  
  26.                         modified = true;  
  27.                     }  
  28.                 }  
  29.             } catch (IOException e) {  
  30.                 e.printStackTrace();  
  31.                 System.exit(-1);  
  32.             } finally {  
  33.                 try {  
  34.                     assert (in != null && out != null);  
  35.                     in.close();  
  36.                     out.close();  
  37.                 } catch (IOException e) {  
  38.                     e.printStackTrace();  
  39.                 }  
  40.             }  
  41.             if (modified) {  
  42.                 file.delete();  
  43.                 temp.renameTo(new File(path));  
  44.                 System.out.println("File "+file.getAbsolutePath()+" washed.");  
  45.             } else {  
  46.                 System.out.println("Not modified, removing temp file "+temp.getAbsolutePath());  
  47.                 temp.delete();  
  48.             }  
  49.         } else {  
  50.             for (File child : file.listFiles()) {  
  51.                 wash(child);  
  52.             }  
  53.         }  
  54.     }  
  55.   
  56. }  

下面是groovy的版本 :
java 代码
 
  1. wash = { dir ->  
  2.     dir.eachFile { child ->  
  3.         if(child.isFile()){  
  4.             path = child.absolutePath  
  5.             print "washing file "+path+"..."  
  6.             temp = new File(path+".bak")  
  7.             modified = false;  
  8.             temp.withOutputStream { outputStream ->  
  9.                 child.eachByte{ bbyte ->  
  10.                     if(bbyte != (byte)0xa0){  
  11.                         outputStream.write(bbyte)  
  12.                     } else {  
  13.                       modified = true  
  14.                     }  
  15.                 }  
  16.             }  
  17.            if(modified){  
  18.                child.delete()  
  19.                temp.renameTo(new File(path))  
  20.                println("File "+path +" washed.")  
  21.            } else {  
  22.                println("Not modified, removing temp file "+temp.absolutePath)  
  23.                temp.delete()  
  24.            }  
  25.         } else {  
  26.             println("washing subdirectory..."+child.absolutePath)  
  27.             wash(child)  
  28.         }  
  29.     }  
  30. }  
  31.   
  32. wash(new File("c:/temp/seamsrc"))  
groovy跟java还是亲啊,有了java版本,groovy版本很快就出来了。代码量确实有缩减,还了解到groovy的closure的作用域与def的使用有些关联。其实在这段代码中外层的wash closure跟method的定义已经没啥区别了。

在做ruby时,发现ruby的文件操作API极度混乱,在javaeye ruby版本发了点牢骚,还跟人论战了一把,后来我的想法得到了松底迪的支持,挺高兴,于是就有了fileex的实现。使用fileex后的ruby实现代码如下:
ruby 代码
 
  1. require "fileex"  
  2.   
  3. def wash(dir)  
  4.     dir.each|child|  
  5.         if child.directory?  
  6.             wash(child)  
  7.         else  
  8.             path = child.path  
  9.             puts "washing file #{path}..."  
  10.             temp = File.new("#{path}.bak").create.open("w+")  
  11.             modified = false  
  12.             child.open.each_byte{ |byte|  
  13.                 temp.putc(byte)  
  14.                 if byte!=0xA0  
  15.                     temp.putc(byte)  
  16.                 else  
  17.                     modified = true  
  18.                 end  
  19.             }  
  20.             child.close  
  21.             temp.close  
  22.             if modified  
  23.                 puts "File #{path} washed."  
  24.                 child.delete  
  25.                 temp.rename(path)  
  26.             else  
  27.                 temp.delete  
  28.             end  
  29.         end  
  30.     }  
  31. end  
  32.   
  33. wash("c:/temp/seamsrc".to_file)  
这下终于爽了。
分享到:
评论

相关推荐

    小学生四则运算练习系统

    "小学生四则运算练习系统"便是这样一款针对小学生数学学习的智能工具,旨在帮助孩子们巩固加、减、乘、除四则运算的基本技能。 四则运算作为小学数学的基础,对于孩子的逻辑思维能力和计算能力培养至关重要。这款...

    帮助小学生练习四则运算的c语言程序

    综上所述,这个C语言程序是一个专门为小学生设计的四则运算练习工具,利用随机函数生成不同难度的算术题,提供了一个互动式的学习环境,有助于提升他们的计算技巧和数学兴趣。同时,通过源代码,开发者还可能采用了...

    小键盘练习适用于财会练习小键盘的使用

    运算符练习则可以结合加减乘除,让使用者熟悉财务计算中的常见操作。 在财会领域,快速准确的数据录入是基本要求。小键盘的熟练使用可以显著降低工作中的错误率,节省时间,提高工作效率。此外,对于需要进行大量...

    小键盘数字键练习

    "小键盘数字键练习精灵2011.exe"是一款针对小键盘数字键训练的软件,可能包含了各种练习模式。例如,它可能会有基础的数字输入练习,用户需要按照屏幕显示的数字顺序敲击对应的小键盘数字;还可能有速度挑战模式,...

    40个Qt学习练习小案例

    【Qt学习练习小案例】是针对Qt框架设计的一系列编程实践项目,旨在帮助初学者深入理解和掌握Qt库的使用。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式系统的软件开发,主要使用C++语言。通过...

    简单java程序的小练习

    在“简单java程序的小练习”这个压缩包中,我们看到一系列入门级的Java编程实践项目。这些项目旨在帮助初学者熟悉Java语言的基本概念,并通过实际操作来增强编程技能。让我们逐一探讨这些项目所涵盖的Java知识点。 ...

    绿色数字小键盘练习软件

    标题中的“绿色数字小键盘练习软件”是一款专为提高用户数字小键盘操作速度和准确性而设计的应用程序。这款软件的特点是“绿色”,意味着它不含有任何恶意软件或广告插件,用户可以安全地使用,无需担心对计算机系统...

    好用的数字小键盘练习软件

    总的来说,数字小键盘练习软件是一种实用的工具,通过科学的训练方法,帮助用户提升小键盘操作技能,对于需要频繁使用数字键的专业人士而言,能够显著提高工作效率,减少错误。通过安装并使用“NumExercise.exe”,...

    原生JS经典小项目-DOM练习

    在本项目"原生JS经典小项目-DOM练习"中,我们将深入探讨JavaScript与DOM(文档对象模型)的交互,这是Web开发中的核心技能。DOM是HTML和XML文档的编程接口,它允许我们通过JavaScript来查找、修改和操作页面元素。在...

    四则运算练习器

    四则运算练习器是一款专为提升用户口算能力设计的应用程序。它涵盖了加法、减法、乘法和除法这四种基本的数学运算,旨在帮助用户,特别是学生群体,加强心算技巧,提高数学计算速度和准确性。通过反复练习,用户可以...

    制作一个给小学生练习100以内四则运算的app

    制作一个给小学生练习100以内四则运算的app

    python基础练习小程序

    "Python基础练习小程序"是一系列精心设计的编程任务,旨在帮助初学者掌握Python语言的基础概念和常见算法。这些练习通常包括变量与数据类型、控制流(条件语句与循环)、函数、模块化编程、字符串处理、列表操作、...

    小键盘打字练习

    在“小键盘打字练习”这个项目中,我们看到开发者利用C++和API编程技巧,创建了一个用于提升用户小键盘打字速度和准确性的应用。 标题中的"小键盘打字练习"表明这是一个针对提升用户使用小键盘输入技能的软件。小...

    四则运算练习软件

    标题中的“四则运算练习软件”指的是一个专为学习和练习基本数学运算——加法、减法、乘法和除法——设计的应用程序。这款软件是用Java编程语言开发的,这是一种广泛使用的、面向对象的编程语言,因其跨平台性和强大...

    java基础各部分小程序练习题

    这份"java基础各部分小程序练习题"集合,无疑为初学者提供了一个绝佳的学习和实践平台。作者无私地分享了他在学习过程中所做的练习,这是一份宝贵的资源,可以帮助学习者检验和巩固自己的Java知识。 首先,我们要...

    小键盘练习

    小键盘的熟练使用是IT从业者,特别是那些需要大量数字输入工作的人必备技能之一。通过持续的练习和实际操作,不仅可以提高工作效率,还能减少错误,提升工作质量。所以,无论是初学者还是经验丰富的专业人士,都应该...

    一个自己练习的小游戏程序

    标题中的“一个自己练习的小游戏程序”表明这是一个用于学习和提升编程技能的项目,很可能是由个人开发者编写的。在编程领域,制作小游戏是初学者和有经验的开发者经常采用的一种方式,它可以帮助他们熟悉编程语言、...

    C++练习的各种小程序

    本资料包“C++练习的各种小程序”提供了一系列的实践案例,旨在帮助初学者深入理解和运用C++。 1. **基础语法**:C++的基础包括变量、数据类型、运算符、流程控制(如if语句、switch语句、循环结构for、while、do-...

    java练习小项目

    这个"Java练习小项目"就是这样一个实战平台,旨在帮助Java初学者或爱好者加深对编程语言的理解,特别是面向对象的设计和数据结构的运用。项目的核心是实现一个能够管理城市人口信息的系统,具备无限级别的城市分级...

Global site tag (gtag.js) - Google Analytics