科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道利用JAVA向垃圾电子邮件宣战

利用JAVA向垃圾电子邮件宣战

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  摘 要:计算机技术给我们的日常生活带来了很多便利:来自生产线 的产品、高效的通信以及大量易于访问的信息,然而它同时也带来了垃圾电子邮件。幸运的是, 我们已经有办法对付它。本文将对Java类库的I/O包以及建立在其上的“流”模型进行深入的讨 论。

作者:中国IT实验室 来源:中国IT实验室 2007年9月26日

关键字: 编程 java

  • 评论
  • 分享微博
  • 分享邮件

  摘 要:计算机技术给我们的日常生活带来了很多便利:来自生产线 的产品、高效的通信以及大量易于访问的信息,然而它同时也带来了垃圾电子邮件。幸运的是, 我们已经有办法对付它。本文将对Java类库的I/O包以及建立在其上的“流”模型进行深入的讨 论,包括:它是如何工作的,Java1.0.2和Java1.1在I/O实现方面的差别,以及如何利用这些知 识建立一个垃圾电子邮件“过滤器”。
  “足不出户,也能至富”
  “神奇的饮食,一周减肥20磅”
  “热情的XXX宝贝想见你”
  有时,我们会收到很多不受欢迎的 电子邮件,这些邮件往往令人不快。那些还没有受垃圾电子邮件之苦的幸运者也应该意识到这 是一个现实的问题。这里我们将介绍一种利用JAVA控制垃圾电子邮件的方法。
  监视敌人
  我们无法逃避垃圾电子邮件,只能 尽量减少它对我们生活的侵扰。最好,也是最有效的方法是阻止人们给我们发不受欢迎的电子 邮件。我们必须在看到垃圾电子邮件之前消除它,那么如何实现呢?
  一种行之有效的方法是检查电子邮件的内容,然后决定是否保留它。其实,我们在阅读电子邮件时就是这样做的:我们一个接一个字符、一行接一行地读电子邮件,搜索我们认识地单词,如果其中包括单词“Java”,我们便保留它,如果包括“MakeMoneyFast”,我们便将它扔到垃圾桶里。能否编制一个计算机程序来帮助我们更有效地工作呢?
  战术评估
  下面,我们讨论Java类库I/O包中 的类。Java类库的输入输出类基于一种简单但强大的模型:“流”(Streams)。
  在“流”模型中,信 息从一点“流”到另一点,就象在河流或者管道中一样。在“流”中的任何一点,观察者看到信息一 点一点地顺序流过。这种模型适合现实世界中很多类型的信息,比如来自计算机键盘的键 码(Keycodes)、来自声音文件的声音数据、来自文本文件的一行接一行的文本等都是信息流。
   
  图1“流”中信息从一点传到另一点
  “流”中的一个重 要工具便是“过滤器”(Filters)。“过滤器”从“流”的“上游”获取信息,用某种方式过滤或者处理 后,发送到“流”的“下游”。“流”模型功能强大的关键是可以用一些非常简单的、独立的“过滤器” 串成一个功能强大的复合“过滤器”。
   
  图2“过滤器”中断处理信息流
  
  图3级联“过滤器”
  Java类库将“流”分为两类──输 入和输出,这种区分在理论上是不必要的,但是在实际应用中却是有用的。输入“流”的最初来源 是某一设备或者文件,它将数据从设备或文件输入到程序中,输入“流”在处理中一般是要过滤 的。输出“流”的最终目标也是某一设备或者文件,它将数据从程序输出到设备或文件中,输入“ 流”在处理中一般也是要过滤的。
  有两个原因使我们将Java类库中 的“流”类应用到垃圾电子邮件问题的解决方案中:
  可以很容易地将电子邮件看做是一个接一个字符、一行接一行进入到计算机的。
  当电子邮件进入计算机时,我们要一个接一个字符、一行接一行地检查是否与我们指定的模板匹配。
  兵工厂──“流”类详细介绍
  Java1.1说明书中描述了两种基 本相同的输入和输出类集,一种是面向字节的,另一种是面向字符的。面向字节“流”类与在Java 1.0.2中实现的只有微小的差别,而面向字符“流”类是在Java1.1版本中最新实现的。
  本文中我们讨论面向字节的“流”类,这样做有两个原因。首先,对那些没有使用Java1.1的人也可以利用这份材料;其次,我们可以指出Java1.0.2中类库中出现、在Java1.1中已经修正的一些错误。
  上面已经提过,“流”可以分为两类:输入“流”和输出“流”。在Java中,所有面向字节的输入“流”类都是抽象类InputStream的子类,InputStream定义了所有输入“流”类必须提供的一套基本方法(Mothods)。同样,所有面向字节的输出“流”类都是抽象类OutputStream的子类,OutputStream定义了所有输出“流”类必须提供的一套基本方法(Mothods)。
  通用输入“流”类方法
  以下是对所有输入“流”通用的方 法,每个方法说明之后列出了方法能执行的任务。
  publicint read()throws IOException
  从输入“流”读一个 字节并且返回此字节。
  如果已经 到了输入“流”的结尾,则返回-1。
  如果必要,阻塞(或等待)直到数据可用。
  当读操作时发生错误,则抛 出IOException异常。
  publicint read(byte[]rgb) throws IOException
  从输入“ 流”读一字节序列并且置于指定的数组中。
  返回所读的字节数。
  如果已经到了输入“流”的结尾, 则返回-1。
  如果必要,阻塞(或等 待)直到数据可用。
  当读操作时发 生错误,则抛出IOException异常。
  publicint read(byte[]rgb, intnOff,intnLen)throws IOException
  从输入“流”读一指定长度的字节 序列并且置于指定的数组中指定偏移上。
  返回所读的字节数。
  如果已经到了输入“流”的结尾, 则返回-1。
  如果必要,阻塞(或等 待)直到数据可用。
  当读操作时发 生错误,则抛出IOException异常。
  publiclong skip(longn) throws IOException
  跳过指定 的字节数。
  返回跳过的字节数。
  如果已经到了输入“流”的结尾, 则返回-1。
  当操作时发生错误,则 抛出IOException异常。
  publicinta vailable() throws IOException
  返回可以 从输入“流”中读取的字节数,而不产生读操作阻塞。
  当操作时发生错误,则抛 出IOException异常。
  publicvoid close()throws IOException
  关闭输入“流”,释 放所有与此输入“流”有关的资源(例如操作系统文件句柄)。
  当操作时发生错误,则抛 出IOException异常。
  publicvoid mark(int nReadLimit)
  在输入“流”中标识 当前位置,以后当调用reset()时,输入“流”将重新定位在此位置上。
  指定在标识无效之前,标识之后 能读取的字节数。
  publicvoid reset()throws IOException
  将输入“流”重新定 位在最近标识的位置上。
  如果“ 流”没有标识,或者标识已经无效,则抛出IOException异常。
  public boolean mark Supported()
  显示此输入“ 流”是否支持mark和reset操作。
  通用输出“流”类方法
  以下是对所有输出“流”通用的方 法,与前一部分一样,每个方法说明之后列出了方法能执行的任务。
  publicvoid write(byteb) throws IOException
  将一个字 节写入输出“流”。
  阻塞(或等待) 直到数据真正写入。
  当写操作时 发生错误,则抛出IOException异常。
  publicvoid write(byte[] rgb)throws IOException
  将一 个字节序列写入输出“流”。
  阻塞( 或等待)直到数据真正写入。
  当写操作时发生错误,则抛出IOException异常。
  publicvoid write (byte[] rgb,intnOff,intnLen) throws IOException
  将一个指定长度的字节序列从指 定的偏移量开始写入输出“流”。
  阻塞(或等待)直到数据真正写入。
  当写操作时发生错误,则抛 出IOException异常。
  publicvoid flush ()throws IOException
  “冲洗”输出“流”, 立即写所有的缓冲数据。
  当操作 时发生错误,则抛出IOException异常。
  publicvoidclose()throws IOException
  关闭输出“流”,释 放所有与此输出“流”有关的资源(例如操作系统文件句柄)。
  当操作时发生错误,则抛 出IOException异常。
  攻击计划
  本文的代码有三种形式,这是因 为:在Java1.0.2中字节到字符的转换有重要的瑕疵(使语言对Unicode的支持无实质用处),为 了支持国际化,这个瑕疵在Java1.1中得到了修正。结果是产生两套几乎相同的API,仅仅在提 供给字节到字符的转换的方法有所区别。为了给所有人提供可工作的代码,以及显示API是如何 改变的,我们用三个包提供代码,必要时可以下载所有三个包做比较,也可以下载适合你平台的 包。
  第一个包运行在Java1.0.2, 有tar文件和zip文件。
  第二个包运行在Java1.1,也 有tar文件和zip文件。
  第三个包同时运行在Java1.0.2 和Java1.1,这个包没有使用API中冲突的部分,它自己完成工作,你如果对可移植性更感兴趣, 可以以tar文件或者zip文件下载此包。本文的代码不是以小程序(Applets)的方式运行,所以你 需要Java Develop ment Kit或者类似的命令行环境。
  首先在你的系统中用正确的方 法解开下载的文件,然后在命令行下按照如下命令执行Java Runtime:%javaMain [keyword] [keyword]...[emailfile]。你可以在命令行中指定任意多的关键字(Keywords)。程 序对每个关键字建立一个“过滤器”,然后将它们一起连接入一个“流”。当输入以标准输入 进入时,程序从标准输入中读取数据,通过“流”传送这些数据,写入标准输出中。如果有一 个“过滤器”检测到一个关键字,就会产生一个异常,以结束程序。这种解决方案很简单,但 是非常有用而且高效。
  
  
  
  
  
  

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊风欢锟犲矗鎼淬劌绐楅柡鍥╁亹閺嬪酣鏌曡箛瀣仾濠殿垰銈搁弻鏇$疀鐎n亖鍋撻弽顓ㄧ稏闁跨噦鎷�

    婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掆偓缂嶅﹪骞冨Ο璇茬窞闁归偊鍓涢悾娲⒑闂堟单鍫ュ疾濠婂嫭鍙忔繝濠傜墛閸嬨劍銇勯弽銊с€掗柟钘夊暣閺岀喖鎮滈埡鍌涚彋閻庤娲樺畝绋跨暦閸洖鐓涢柛灞剧矋濞堟悂姊绘担绛嬪殐闁搞劋鍗冲畷銏ゅ冀椤愩儱小闂佹寧绋戠€氼參宕伴崱妯镐簻闁靛牆鎳庢慨顒€鈹戦埥鍡椾簼婵犮垺锚铻炴俊銈呮噺閸嬪倹绻涢崱妯诲碍閻庢艾顦甸弻宥堫檨闁告挾鍠庨锝夘敆娓氬﹦鐭楁繛鎾村焹閸嬫捇鏌e☉娆愬磳闁哄本绋戦埞鎴﹀川椤曞懏鈻婄紓鍌欑劍椤ㄥ懘鎯岄崒鐐靛祦閹兼番鍔岄悞鍨亜閹烘垵顏╅悗姘槹閵囧嫰寮介妸褎鍣ョ紓浣筋嚙濡繈寮婚悢纰辨晣鐟滃秹鎮橀懠顒傜<閺夊牄鍔庣粻鐐烘煛鐏炶姤鍠橀柡浣瑰姍瀹曠喖顢橀悩铏钒闂備浇宕垫慨鎶芥⒔瀹ュ鍨傞柦妯猴級閿濆绀嬫い鏍ㄧ☉濞堟粓姊虹涵鍛【妞ゎ偅娲熼崺鈧い鎺嗗亾闁挎洩濡囧Σ鎰板籍閸繄顓洪梺缁樺姇瀵剙螖閸涱喚鍘搁梺鍓插亽閸嬪嫰鎮橀敃鍌涚厱閻庯綆鍋嗘晶顒傜磼閸屾稑绗ч柟鐟板閹煎湱鎲撮崟闈涙櫏闂傚倷绀侀幖顐も偓姘卞厴瀹曞綊鏌嗗鍛紱閻庡箍鍎遍ˇ浼村磿瀹ュ鐓曢柡鍥ュ妼婢ь垰霉閻樿秮顏堟箒闂佹寧绻傚Λ妤呭煝閺囥垺鐓冪憸婊堝礈濮樿泛钃熼柕濞у嫷鍋ㄩ梺缁樺姇椤曨參鍩㈤弴銏″€甸柨婵嗗€瑰▍鍥ㄣ亜韫囨稐鎲鹃柡灞炬礋瀹曢亶顢橀悢濂変紦

    重磅专题
    往期文章
    最新文章