外文翻译java

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

外文资料译文及原文

Java

Java I/O 系统

对编程语言的设计者来说,创建一套好的输入输出(I/O)系统,是一项难度

极高的任务。

这一点可以从解决方案的数量之多上看出端倪。这个问题难就难在它要面对的可能性太多了。不仅是因为有那么多 I/O 的源和目地(文件,控制台,网络连接等等),而且还有很多方法(顺序的『sequential』,随机的『random-access』, 缓存的『 buffered 』,二进制的『 binary 』,字符方式的『 character 』,行的『by lines 』,字的『 by words 』,等等)。

Java类库的设计者们用"创建很多类"的办法来解决这个问题。坦率地说

Java I/O 系统的类实在是太多了,以至于初看起来会把人吓着(但是,具有讽刺意味的是,这种设计实际上是限制了类的爆炸性增长)。此外,Java在1.0

版之后又对其 I/O 类库作了重大的修改,原先是面向 byte 的,现在又补充了面向Unicode字符的类库。为了提高性能,完善功能,JDK1.4又加了一个nio(意思是"new I/O"。这个名字会用上很多年)。这么以来,如果你想对Java的I/O 类库有个全面了解,并且做到运用自如,你就得先学习大量的类。此外,了解 I/O 类库的演化的历史也是相当重要的。可能你的第一反应是 "别拿什么历史来烦我了,告诉我怎么用就可以了! "但问题是,如果你对这段历史一无所知,很快就会被一些有用或是没用的类给搞糊涂了。

本章会介绍 Java 标准类库中的各种 I/O 类,及其使用方法。

File 类

在介绍直接从流里读写数据的类之前,我们先介绍一下处理文件和目录的类。

File 类有一个极具欺骗性的名字;或许你会认为这是一个关于文件的类,但它不是。你可以用它来表示某个文件的名字,也可以用它来表示目录里一组文件的名字。如果它表示的是一组文件,那么你还可以用 list( ) 方法来进行查询,让它会返回 String 数组。由于元素数量是固定的,因此数组会比容器更好一些。如果你想要获取另一个目录的清单,再建一个 File 对象就是了。实际上,叫它 "FilePath" 可能会更好一些。下面我们举例说明怎样使用这个类及其相关的 FilenameFilter 接口。

目录列表器

假设你想看看这个目录。有两个办法。一是不带参数调用 list( ) 。它返回的是 File 对象所含内容的完整清单。但是,如果你要的是一个 " 限制性列表(restricted list)" 的话——比方说,你想看看所有扩展名为 .java 的文件

——那么你就得使用 "目录过滤器 " 了。这是一个专门负责挑选显示 File 对象的内容的类。

下面就是源代码。看看,用了 java.utils.Arrays.sort( ) 和 11 章的AlphabeticComparator 之后,我们没费吹灰之力就对结果作了排序 ( 按字母顺序):

//: c12:DirList.java

// Displays directory listing using regular expressions.

// {Args: "D.*\.java"} import java.io.*; import java.util.*; import

java.util.regex.*; import com.bruceeckel.util.*; public class DirList { public static void main(String[] args) {

File path = new File(".");

String[] list;

if(args.length == 0)

list = path.list();

else

list = path.list(new DirFilter(args[0]));

Arrays.sort(list, new AlphabeticComparator());

for(int i = 0; i < list.length; i++)

System.out.println(list[i]);

}

}

class DirFilter implements FilenameFilter {

private Pattern pattern;

public DirFilter(String regex) {

pattern = pile(regex);

}

public boolean accept(File dir, String name) {

// Strip path information, search for regex:

return pattern.matcher(

new File(name).getName()).matches();

} } ///:~

DirFilter 实现了 FilenameFilter 接口。我们来看看 FilenameFilter 究竟

有多简单:

public interface FilenameFilter {

boolean accept(File dir, String name);

}

也就是说,这类对象的任务就是提供一个 accept( ) 的方法。之所以要创建这个类,就是要给 list( ) 提供一个 accept( ) 方法,这样当 list( ) 判断该返回哪些文件名的时候,能够 "回过头来调用 "accept( ) 方法。因此,这种结构通常被称为回调 (callback) 。更准确地说,由于 list( ) 实现了基本功能,而FilenameFilter 提供了"对外服务所需的算法 " ,因此这是一种 "策略模式 ( Strategy Pattern )" 。由于 list( ) 拿 FilenameFilter 对象当参数,因此你可以将任何实现FilenameFilter 接口的对象传给它,并以此 ( 甚至是在运行时 ) 控制 list( ) 的工作方式。回调能提高程序的灵活性。

DirFilter 还告诉我们, interface 只是包含了一些方法,它没说你只能写这些方法。 ( 但是,你至少要定义接口里有的方法。 ) 这里我们还定义了 DirFilter 的构造函数。

accept( ) 方法需要两个参数,一个是 File 对象,表示这个文件是在哪个目录里面的;另一个是 String ,表示文件名。虽然你可以忽略它们中的一个,甚至两个都不管,但是你大概总得用一下文件名吧。记住, list( ) 会对目录里的每个文件调用 accept( ) ,并以此判断是不是把它包括到返回值里;这个判断依据就是

accept( ) 的返回值。

切记,文件名里不能有路径信息。为此你只要用一个 String 对象来创建 File 对象,然后再调用这个 File 对象的 getName( ) 就可以了。它会帮你剥离路径信息(以一种平台无关的方式)。然后再在 accept( ) 里面用正则表达式 (regular expression) 的 matcher 对象判断, regex 是否与文件名相匹配。兜完这个圈子,list( ) 方法返回了一个数组。

匿名内部类

这是用匿名内部类 (详见第八章 )来重写程序的绝佳机会。下面我们先创建一

相关文档
最新文档