快速业务通道

技巧:当不能抛出异常时 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
和 Comparator 是为确定的、可预测的比较操作而设计的。一旦 I/O 不再符合这种情况,很可能常用的算法和接口变得不适用。即使勉强可以使用,其效率也极其低下。

例如,假设不是按标准路径来比较文件,而是按内容来比较文件。对于所比较的两个文件,每个比较操作都需要读文件的内容 — 甚至可能是完整的内容。这样一来,高效的算法会想要尽量减少读的次数,并且可能会想缓存每次读的结果 — 或者,如果文件较大,则可能缓存每个文件的 hashcode — 而不是每次比较时重新读每个文件。同样,您会想到首先填充一个比较键列表,然后进行排序,而不是进行内联排序。

可以想象定义一个单独的、并行的 IOComparator 接口,该接口抛出必要的异常,如清单 5 所示:

清单 5. 独立的 IOComparator 接口

import java.io.IOException; public interface IOComparator<T> {    int compare(T o1, T o2) throws IOException; }

然后基于这个类定义一个单独的、相近实用程序树,由它对集合的临时副本进行必要的操作,从而允许抛出异常,同时又不会使数据结构处于可能受损害的、中间的状态。例如,清单 6 提供了一个基本的冒泡排序:

清单 6. 用冒泡算法对文件排序

import java.io.IOException; import java.util.ArrayList; import java.util.List; public class IOSorter {    public static <T> void sort(List<T> list, IOComparator<? super T> comparator)     throws IOException {      List<T> temp = new ArrayList<T>(list.size());      temp.addAll(list);      bubblesort(temp, comparator);      // copy back to original list now that no exceptions have been thrown       list.clear();      list.addAll(temp);    }    // of course you can replace this with a better algorithm such as quicksort     private static <T> void bubblesort(List<T> list, IOComparator<? super T> comparator)     throws IOException {      for (int i = 1; i < list.size(); i++) {        for (int j = 0; j < list.size() - i; j++) {          if (comparator.compare(list.get(j), list.get(j + 1)) > 0) {            swap(list, j);          }        }      }    }    private static <T> void swap(List<T> list, int j) {      T temp = list.get(j);      list.set(j, list.get(j+1));      list.set(j + 1, temp);    } }

技巧:当不能抛出异常时(5)

时间:2012-01-28 IBM Elliotte Rusty Harold

这不是唯一的方法。为了清晰,清单 6 有意模仿已有的 Collections.sort() 方法;但是,也许更有效的方法是返回一个新的列表,而不是直接修改旧列表,以防在修改列表时抛出异常所带来的损害。

最终,您实际上承认并着手处理可能出现的 I/O 错误,而不是逃避它,您甚至可以做更高级的错误修正。例如,IOComparator 也许不会被一次 I/O 错误难倒 — 因为很多 I/O 问题是暂时的 — 可以重试几次,如清单 7 所示:

清单 7. 如果一开始不成功,再试几次(但是别试太多次)

import java.io.File; import java.io.IOException; public class CanonicalPathComparator implements IOComparator<File> {    @Override     public int compa

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号