JSPCN主页 | JSP空间 | 网站制作 | JSP下载 | JSP论坛 | JSP教程 | 关于JSPCN | 联系我们
JSP虚拟主机,jsp空间,java空间,java虚拟空间,详细请点击进入
做最专业的JSP中文网站 当前位置首页--JSP技术--JAVAMAIL  
文章搜索:
关键字 标题
  
JSP中文网内容管理系统(JCMS)
JSP虚拟主机
网络笔记本
网摘,图片,笔记收藏
虚拟服务器

JSPCN文章目录分类
JSP配置[219]JSP基础[136]
中文问题[69]上传问题[27]
JAVABEAN[46]数据库[212]
文件操作[126]图片声音[17]
JSP其他[57]时间相关[16]
JAVAMAIL[72]STRUTS[144]
开发工具[28]教程系列[157]
JSP实例[89]
JAVA基础[421]APPLET[78]
JAVA网络[179]Applica[115]
Servlet[98]XML[163]
J2ME[257]J2EE[374]
考试相关[63]JAVA线程[90]
EJB[261]Swing[26]
Java API[141]声音图片[28]
异常处理[33]JAVA实例[290]
JAVA类[139]SUN[89]
Hibernate[6]JMX[8]
Spring[34]
本版推荐文章 
本版热点文章 
相关文章链接 
 
利用JAVA向垃圾电子邮件宣战
作者:未知     文章来源:www.jspcn.net
访问次数:563次     加入时间:2005年01月19日
摘 要 计 算 机 技 术 给 我 们 的 日 常 生 活 带 来 了 很 多 便 利: 来 自 生 产 线 的 产 品、 高 效 的 通 信 以 及 大 量 易 于 访 问 的 信 息, 然 而 它 同 时 也 带 来 了 垃 圾 电 子 邮 件。 幸 运 的 是, 我 们 已 经 有 办 法 对 付 它。 本 文 将 对Java 类 库 的I/O 包 以 及 建 立 在 其 上 的“ 流” 模 型 进 行 深 入 的 讨 论, 包 括: 它 是 如 何 工 作 的,Java 1.0.2 和Java 1.1 在I/O 实 现 方 面 的 差 别, 以 及 如 何 利 用 这 些 知 识 建 立 一 个 垃 圾 电 子 邮 件“ 过 滤 器”。

“ 足 不 出 户, 也 能 至 富”
“ 神 奇 的 饮 食, 一 周 减 肥20 磅”
“ 热 情 的XXX 宝 贝 想 见 你”
有 时, 我 们 会 收 到 很 多 不 受 欢 迎 的 电 子 邮 件, 这 些 邮 件 往 往 令 人 不 快。 那 些 还 没 有 受 垃 圾 电 子 邮 件 之 苦 的 幸 运 者 也 应 该 意 识 到 这 是 一 个 现 实 的 问 题。 这 里 我 们 将 介 绍 一 种 利 用JAVA 控 制 垃 圾 电 子 邮 件 的 方 法。

监 视 敌 人
我 们 无 法 逃 避 垃 圾 电 子 邮 件, 只 能 尽 量 减 少 它 对 我 们 生 活 的 侵 扰。 最 好, 也 是 最 有 效 的 方 法 是 阻 止 人 们 给 我 们 发 不 受 欢 迎 的 电 子 邮 件。 我 们 必 须 在 看 到 垃 圾 电 子 邮 件 之 前 消 除 它, 那 么 如 何 实 现 呢 ?

一 种 行 之 有 效 的 方 法 是 检 查 电 子 邮 件 的 内 容, 然 后 决 定 是 否 保 留 它。 其 实, 我 们 在 阅 读 电 子 邮 件 时 就 是 这 样 做 的: 我 们 一 个 接 一 个 字 符、 一 行 接 一 行 地 读 电 子 邮 件, 搜 索 我 们 认 识 地 单 词, 如 果 其 中 包 括 单 词“Java”, 我 们 便 保 留 它, 如 果 包 括“Make Money Fast”, 我 们 便 将 它 扔 到 垃 圾 桶 里。 能 否 编 制 一 个 计 算 机 程 序 来 帮 助 我 们 更 有 效 地 工 作 呢 ?

战 术 评 估
下 面, 我 们 讨 论Java 类 库I/O 包 中 的 类。Java 类 库 的 输 入 输 出 类 基 于 一 种 简 单 但 强 大 的 模 型:“ 流”(Streams)。

在“ 流” 模 型 中, 信 息 从 一 点“ 流” 到 另 一 点, 就 象 在 河 流 或 者 管 道 中 一 样。 在“ 流” 中 的 任 何 一 点, 观 察 者 看 到 信 息 一 点 一 点 地 顺 序 流 过。 这 种 模 型 适 合 现 实 世 界 中 很 多 类 型 的 信 息, 比 如 来 自 计 算 机 键 盘 的 键 码(Keycodes)、 来 自 声 音 文 件 的 声 音 数 据、 来 自 文 本 文 件 的 一 行 接 一 行 的 文 本 等 都 是 信 息 流。


图1 “流” 中 信 息 从 一 点 传 到 另 一 点

“ 流” 中 的 一 个 重 要 工 具 便 是“ 过 滤 器”(Filters)。“ 过 滤 器” 从“ 流” 的“ 上 游” 获 取 信 息, 用 某 种 方 式 过 滤 或 者 处 理 后, 发 送 到“ 流” 的“ 下 游”。“ 流” 模 型 功 能 强 大 的 关 键 是 可 以 用 一 些 非 常 简 单 的、 独 立 的“ 过 滤 器” 串 成 一 个 功 能 强 大 的 复 合“ 过 滤 器”。


图 2“过 滤 器 ”中 断 处 理 信 息 流


图 3 级 联 “ 过 滤 器 ”

Java 类 库 将“ 流” 分 为 两 类 ─ ─ 输 入 和 输 出, 这 种 区 分 在 理 论 上 是 不 必 要 的, 但 是 在 实 际 应 用 中 却 是 有 用 的。 输 入“ 流” 的 最 初 来 源 是 某 一 设 备 或 者 文 件, 它 将 数 据 从 设 备 或 文 件 输 入 到 程 序 中, 输 入“ 流” 在 处 理 中 一 般 是 要 过 滤 的。 输 出“ 流” 的 最 终 目 标 也 是 某 一 设 备 或 者 文 件, 它 将 数 据 从 程 序 输 出 到 设 备 或 文 件 中, 输 入“ 流” 在 处 理 中 一 般 也 是 要 过 滤 的。

有 两 个 原 因 使 我 们 将Java 类 库 中 的“ 流” 类 应 用 到 垃 圾 电 子 邮 件 问 题 的 解 决 方 案 中:

可 以 很 容 易 地 将 电 子 邮 件 看 做 是 一 个 接 一 个 字 符、 一 行 接 一 行 进 入 到 计 算 机 的。

当 电 子 邮 件 进 入 计 算 机 时, 我 们 要 一 个 接 一 个 字 符、 一 行 接 一 行 地 检 查 是 否 与 我 们 指 定 的 模 板 匹 配。
兵 工 厂 ─ ─“ 流” 类 详 细 介 绍
Java 1.1 说 明 书 中 描 述 了 两 种 基 本 相 同 的 输 入 和 输 出 类 集, 一 种 是 面 向 字 节 的, 另 一 种 是 面 向 字 符 的。 面 向 字 节“ 流” 类 与 在Java 1.0.2 中 实 现 的 只 有 微 小 的 差 别, 而 面 向 字 符“ 流” 类 是 在Java 1.1 版 本 中 最 新 实 现 的。

本 文 中 我 们 讨 论 面 向 字 节 的“ 流” 类, 这 样 做 有 两 个 原 因。 首 先, 对 那 些 没 有 使 用Java 1.1 的 人 也 可 以 利 用 这 份 材 料; 其 次, 我 们 可 以 指 出Java 1.0.2 中 类 库 中 出 现、 在Java 1.1 中 已 经 修 正 的 一 些 错 误。

上 面 已 经 提 过,“ 流” 可 以 分 为 两 类: 输 入“ 流” 和 输 出“ 流”。 在Java 中, 所 有 面 向 字 节 的 输 入“ 流” 类 都 是 抽 象 类InputStream 的 子 类,InputStream 定 义 了 所 有 输 入“ 流” 类 必 须 提 供 的 一 套 基 本 方 法(Mothods)。 同 样, 所 有 面 向 字 节 的 输 出“ 流” 类 都 是 抽 象 类OutputStream 的 子 类,OutputStream 定 义 了 所 有 输 出“ 流” 类 必 须 提 供 的 一 套 基 本 方 法(Mothods)。

通 用 输 入“ 流” 类 方 法
以 下 是 对 所 有 输 入“ 流” 通 用 的 方 法, 每 个 方 法 说 明 之 后 列 出 了 方 法 能 执 行 的 任 务。

public int read() throws IOException
从 输 入“ 流” 读 一 个 字 节 并 且 返 回 此 字 节。
如 果 已 经 到 了 输 入“ 流” 的 结 尾, 则 返 回-1。
如 果 必 要, 阻 塞( 或 等 待) 直 到 数 据 可 用。
当 读 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public int read(byte [] rgb) throws IOException
从 输 入“ 流” 读 一 字 节 序 列 并 且 置 于 指 定 的 数 组 中。
返 回 所 读 的 字 节 数。
如 果 已 经 到 了 输 入“ 流” 的 结 尾, 则 返 回-1。
如 果 必 要, 阻 塞( 或 等 待) 直 到 数 据 可 用。
当 读 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public int read(byte [] rgb, int nOff, int nLen) throws IOException
从 输 入“ 流” 读 一 指 定 长 度 的 字 节 序 列 并 且 置 于 指 定 的 数 组 中 指 定 偏 移 上。
返 回 所 读 的 字 节 数。
如 果 已 经 到 了 输 入“ 流” 的 结 尾, 则 返 回-1。
如 果 必 要, 阻 塞( 或 等 待) 直 到 数 据 可 用。
当 读 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public long skip(long n) throws IOException
跳 过 指 定 的 字 节 数。
返 回 跳 过 的 字 节 数。
如 果 已 经 到 了 输 入“ 流” 的 结 尾, 则 返 回-1。
当 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public int available() throws IOException
返 回 可 以 从 输 入“ 流” 中 读 取 的 字 节 数, 而 不 产 生 读 操 作 阻 塞。
当 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public void close() throws IOException
关 闭 输 入“ 流”, 释 放 所 有 与 此 输 入“ 流” 有 关 的 资 源( 例 如 操 作 系 统 文 件 句 柄)。
当 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public void mark(int nReadLimit)
在 输 入“ 流” 中 标 识 当 前 位 置, 以 后 当 调 用reset() 时, 输 入“ 流” 将 重 新 定 位 在 此 位 置 上。
指 定 在 标 识 无 效 之 前, 标 识 之 后 能 读 取 的 字 节 数。

public void reset() throws IOException
将 输 入“ 流” 重 新 定 位 在 最 近 标 识 的 位 置 上。
如 果“ 流” 没 有 标 识, 或 者 标 识 已 经 无 效, 则 抛 出IOException 异 常。

public boolean markSupported()
显 示 此 输 入“ 流” 是 否 支 持mark 和reset 操 作。

通 用 输 出“ 流” 类 方 法
以 下 是 对 所 有 输 出“ 流” 通 用 的 方 法, 与 前 一 部 分 一 样, 每 个 方 法 说 明 之 后 列 出 了 方 法 能 执 行 的 任 务。

public void write(byte b) throws IOException
将 一 个 字 节 写 入 输 出“ 流”。
阻 塞( 或 等 待) 直 到 数 据 真 正 写 入。
当 写 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public void write(byte [] rgb) throws IOException
将 一 个 字 节 序 列 写 入 输 出“ 流”。
阻 塞( 或 等 待) 直 到 数 据 真 正 写 入。
当 写 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public void write(byte [] rgb, int nOff, int nLen) throws IOException
将 一 个 指 定 长 度 的 字 节 序 列 从 指 定 的 偏 移 量 开 始 写 入 输 出“ 流”。
阻 塞( 或 等 待) 直 到 数 据 真 正 写 入。
当 写 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public void flush() throws IOException
“ 冲 洗” 输 出“ 流”, 立 即 写 所 有 的 缓 冲 数 据。
当 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

public void close() throws IOException
关 闭 输 出“ 流”, 释 放 所 有 与 此 输 出“ 流” 有 关 的 资 源( 例 如 操 作 系 统 文 件 句 柄)。
当 操 作 时 发 生 错 误, 则 抛 出IOException 异 常。

攻 击 计 划
本 文 的 代 码 有 三 种 形 式, 这 是 因 为: 在Java 1.0.2 中 字 节 到 字 符 的 转 换 有 重 要 的 瑕 疵( 使 语 言 对Unicode 的 支 持 无 实 质 用 处), 为 了 支 持 国 际 化, 这 个 瑕 疵 在Java 1.1 中 得 到 了 修 正。 结 果 是 产 生 两 套 几 乎 相 同 的API, 仅 仅 在 提 供 给 字 节 到 字 符 的 转 换 的 方 法 有 所 区 别。 为 了 给 所 有 人 提 供 可 工 作 的 代 码, 以 及 显 示API 是 如 何 改 变 的, 我 们 用 三 个 包 提 供 代 码, 必 要 时 可 以 下 载 所 有 三 个 包 做 比 较, 也 可 以 下 载 适 合 你 平 台 的 包。

第 一 个 包 运 行 在Java 1.0.2, 有tar 文 件 和zip 文 件。

第 二 个 包 运 行 在Java 1.1, 也 有tar 文 件 和zip 文 件。

第 三 个 包 同 时 运 行 在Java 1.0.2 和Java 1.1, 这 个 包 没 有 使 用API 中 冲 突 的 部 分, 它 自 己 完 成 工 作, 你 如 果 对 可 移 植 性 更 感 兴 趣, 可 以 以tar 文 件 或 者zip 文 件 下 载 此 包。 本 文 的 代 码 不 是 以 小 程 序(Applets) 的 方 式 运 行, 所 以 你 需 要Java Development Kit 或 者 类 似 的 命 令 行 环 境。

首 先 在 你 的 系 统 中 用 正 确 的 方 法 解 开 下 载 的 文 件, 然 后 在 命 令 行 下 按 照 如 下 命 令 执 行Java Runtime:% java Main [keyword] [keyword] . . . [email file]。 你 可 以 在 命 令 行 中 指 定 任 意 多 的 关 键 字(Keywords)。 程 序 对 每 个 关 键 字 建 立 一 个“ 过 滤 器”, 然 后 将 它 们 一 起 连 接 入 一 个“ 流”。 当 输 入 以 标 准 输 入 进 入 时, 程 序 从 标 准 输 入 中 读 取 数 据, 通 过“ 流” 传 送 这 些 数 据, 写 入 标 准 输 出 中。 如 果 有 一 个“ 过 滤 器” 检 测 到 一 个 关 键 字, 就 会 产 生 一 个 异 常, 以 结 束 程 序。 这 种 解 决 方 案 很 简 单, 但 是 非 常 有 用 而 且 高 效。
 
JSP虚拟主机 | JSP空间 | JSP主机 | JSP双线虚拟主机 | JAVA空间 | JAVA虚拟主机 | 虚拟服务器 | JSP 虚拟服务器 | VPS
Virtual Private Server | JAVA虚拟服务器 | VM服务器 | VHOST | 虚拟操作系统 | JSP论坛 | JAVA论坛 | JSP站点论坛
Copyright © 2002-2005 JSPCN.net. All rights reserved.
JSP中文网    备案序号:蜀ICP备05001583号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号