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

小练习一则

阅读更多
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)  
这下终于爽了。
分享到:
评论

相关推荐

    pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)

    pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)个人大三期末大作业项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。 pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接运行(99分)pytorch CNN网络实现图像二分类问题 猫狗识别 完整代码数据可直接

    LCOH成本计算参数+文献资料.zip

    LCOH成本计算参数+文献资料

    39.基于51单片机的室内温湿度自动控制系统设计(实物).pdf

    39.基于51单片机的室内温湿度自动控制系统设计(实物).pdf

    该存储库基于shouxieaitensorRT_Pro,并进行了调整以支持YOLOv8.zip

    yolo

    基于yolov5的车牌检测包含车牌角点检测.zip

    yolo

    一个基于tensorflow的LSTM识别验证码

    lstm 一个基于tensorflow的LSTM识别验证码.

    某大型再生资源集团管控企业数字化转型SAP解决方案.pdf

    某大型再生资源集团管控企业数字化转型SAP解决方案.pdf

    2025年3月CCF编程能力认证(Python)四级.pdf

    2025年3月CCF编程能力认证(Python)四级.pdf

    80.基于51单片机的交通灯设计【五岔路,左右拐,固定时间】(仿真).pdf

    80.基于51单片机的交通灯设计【五岔路,左右拐,固定时间】(仿真).pdf

    分别使用OpenCVONNXRuntime部署yolov5检测车牌和4个角点包含C和Python两个版本的程序.zip

    yolo

    2024reinforce learning强化学习笔记

    强化学习入门随笔,后续随缘更

    Istio多集群模式下的网格架构解析:实现高可用、弹性与合规的多集群部署

    内容概要:本文详细探讨了Istio多集群模式下的网格架构设计及其应用场景。首先,介绍了多集群部署的优势,如提高弹性和冗余、地理就近性、资源隔离、合规性以及灵活的部署策略。其次,解释了网络模型的概念,区分了单网络和多网络环境的区别及各自的优缺点,并阐述了东西向网关的作用。接着,深入讲解了控制平面模型,对比了单控制面与多控制面的特点,并提出基于可用性和配置隔离的选择标准。然后,讨论了网格部署模型,特别是在多网格环境下如何实现服务间的高效通信。最后,针对租户模式进行了剖析,涵盖软多租户的概念和命名空间级别的安全隔离措施。 适合人群:对Kubernetes和服务网格有兴趣的技术专家、运维工程师、系统架构师及开发者。 使用场景及目标:适用于希望构建高性能、高可用性的分布式系统的团队,特别是在多数据中心或多区域部署场景下,希望通过多集群部署优化服务性能和技术合规性。 其他说明:读者应当熟悉基本的服务网格概念和服务发现机制,以便更好地理解和应用文中提到的各种高级特性与实际案例分析。

    基于Yolov5_DeepSort的物体计数器可以统计车流或人流量等.zip

    yolo

    山东大学软件工程22级计算机组成原理实验

    计组应该是大学实验里最难的,上面的版本不一定是最新的,我忘记了,你们可以检查一下,实现了所有功能,得A

    2025年3月CCF编程能力认证(C++)六级.pdf

    2025年3月CCF编程能力认证(C++)六级.pdf

    linux系统tcpdump的安装包

    linux系统tcpdump的安装包

    SAE AS6171/8-2022 SuspectCounterfeit EEE Parts Detection by Raman Spectroscopy Test Methods

    电子元器件防伪检测之拉曼光谱测试方法及其航空航天应用 内容概要:本文档详细介绍了利用拉曼光谱技术检测疑似假冒电气、电子和机电(Electrical, Electronic, and Electromechanical,EEE)元器件的方法和技术。文档首先阐述了拉曼光谱的基本原理,然后针对具体的操作流程提供了详细的指导。具体涵盖的内容有:不同波长激光对拉曼信号的影响与选择依据,频谱解析度的要求、荧光背景干扰解决办法、分散型与傅里叶变换拉曼光谱仪之间的对比以及激光衍射成像在拉曼显微镜的应用。同时明确了数据解释的标准,并且定义操作、认证和安全保障的要求。 适用人群:主要适用于对元器件进行质量评估的技术人员、质量控制经理和其他从事相关行业的从业人员。 使用场景及目标:主要用于检测假冒元器件,在实际生产和采购过程中保障供应链的质量。它有助于确保使用的元器件来自可靠的来源,从而减少生产中的故障率并提高成品可靠性。另外还包括实验室内部的质量管理和第三方审核等环节。 其他说明:本文件由SAE国际制定,每五年复审一次,旨在提供最先进且标准化的方法来应对假货威胁。此外还提供了具体的资格认证级别(如三级),

    Delphi 12.3控件之EhLib-11.0.7-for-D12-ZJM.rar

    Delphi 12.3控件之EhLib_11.0.7_for_D12_ZJM.rar

    60.基于单片机的电压电流表设计(实物).pdf

    60.基于单片机的电压电流表设计(实物).pdf

    基于STM32的智能环境监测系统设计与实现:单片机、传感器集成与无线传输方案

    内容概要:本文详细介绍了一个基于STM32的智能环境监测系统的项目方案,涵盖了硬件选型与设计、传感器应用、数据处理以及无线通信等方面的内容。项目通过主控制器STM32F103C8T6,配合DHT11温湿度传感器、MQ-135气体传感器和光敏电阻光照传感器来获取环境参数;利用带有I2C接口的OLED显示屏进行本地数据展示;配备ESP8266 Wi-Fi模块支持数据远程传输和手机应用程序互动;并采用EEPROM存储数据用于日志记录。文章还包括具体的实现步骤划分成三个阶段,从最初的设备安装调试直至最后的应用软件开发。此外还涉及到多种关键技术点如单片机外围设备的操作、传感器通信协议解读、数据过滤优化以及节能模式下的运作。 适合人群:对单片机编程有兴趣并且希望进一步了解实际应用的学生或者爱好者。这也可以作为电气工程专业的本科生开展相关课程项目的参考资料或是作为电子制作大赛参赛选手的学习材料。 使用场景及目标:①帮助新手熟悉掌握各种类型传感器特性和数据收集技巧;②让读者能够自行组建简单的物理测量工具;③引导技术人员探索物联网领域的创新想法和技术手段。 其他说明:本方案不仅提供完整的硬软件架构思路,

Global site tag (gtag.js) - Google Analytics