没有合适的资源?快使用搜索试试~ 我知道了~
【经典外文翻译】-java(译文-英文)毕业论文.doc
0 下载量 189 浏览量
2023-07-10
17:19:12
上传
评论
收藏 97KB DOC 举报
温馨提示
试读
18页
【经典外文翻译】-java(译文-英文)毕业论文.doc
资源推荐
资源详情
资源评论
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 字符的类库。为了提高性能,完善功能,JDK 1.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 = Pattern.compile(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( )方法返回了一个数组。
匿名内部类
这是用匿名内部类(详见第八章)来重写程序的绝佳机会。下面我们先创建一
个返回 FilenameFilter 的 filter( )方法。
//: c12:DirList2.java
// Uses anonymous inner classes.
// {Args: "D.*\.java"}
import java.io.*;
import java.util.*;
import java.util.regex.*;
import com.bruceeckel.util.*;
public class DirList2 {
public static FilenameFilter filter(final String regex) {
// Creation of anonymous inner class:
return new FilenameFilter() {
剩余17页未读,继续阅读
资源评论
智慧安全方案
- 粉丝: 3708
- 资源: 59万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功