所 有 的 程 序 语 言 都 提 ?copy; 与 本 机 文 件 系 统 交 互 的 方 式;Java也 不 例 外。 我 们 将 看 看Java是 怎 样 处 理 标 准 文 件 输 入 输 出 的(包 括stdin,stout,stderr)。 当 你 在 网 络 上 开 发 小 程 序 时, 你 必 须 注 意 直 接 文 件 输 入 输 出 是 不 安 全 因 素 的 关 键。 大 多 数 用 户 设 置 他 们 的 浏 览 器, 可 让 你 自 由 的 访 问 他 们 的 文 件 系 统, 但 有 ?copy; 不 让 你 访 问。 当 然, 如 果 你 开 发 你 内 部 的 应 用 程 序, 你 也 许 需 要 直 接 访 问 文 件。 标 准 输 入 输 出 Unix的 用 户, 或 其 他 基 于 命 令 行 系 统 的 用 户(如DOS), 都 知 道 标 准 输 入 输 出 的 含 义。 标 准 输 入 文 件 是 键 盘, 标 准 输 出 文 件 是 你 的 终 端 屏 幕。 标 准 错 误 输 出 文 件 也 指 向 屏 幕, 如 果 有 必 要, 它 也 可 以 指 向 另 一 个 文 件 以 便 和 正 常 输 出 区 分。
系 统 类 Java通 过 系 统 类 达 到 访 问 标 准 输 入 输 出 的 功 能。 上 面 提 到 的 三 个 文 件 在 这 个 系 统 类
中 实 现: Stdin System.in作 为InputStream类 的 一 个 实 例 来 实 现stdin, 你 可 以 使
用read()和skip(long n)两 个 成 员 函 数。read()让 你 从 输 入 中 读 一 个 字 节,skip(long n)让 你 在 输
入 中 跳 过n个 字 节。
Stout System.out作 为PrintStream来 实 现stdout, 你 可 以 使
用print()和println()两 个 成 员 函 数。 这 两 个 函 数 支 持Java的 任 意 基 本 类 型 作 为 参 数。
Stderr System.err同stdout一 样 实 现stderr。 象System.out一 样, 你 可 以 访 问PrintStream
成 员 函 数。
9.2 标 准 输 入 输 出 例 子
这 里 有 一 个 例 子, 功 能 象Unix里 的cat或type: import java.io.* class myCat{ public
void main(String args[]) throws IOException{ int b; int count = 0; while ((b =
System.in.read()) !=
-1){ count++; System.out.print((char)b); }
System.out.println();
//blank line
System.err.println(\"counted\"+count+\"total bytes.\"); } }
9.3 普 通 输 入 输 出 类
除 了 基 本 的 键 盘 输 入 和 屏 幕 输 出 外, 我 们 还 需 要 联 系 文 件 的 输 入 输 出。 我 们 将 学 习 下 面 几 个 类: l FileInputStream l DataInputStream l FileOutputStream l DataOutputStream
作 为 参 考, 再 列 出 一 ?copy; 特 定 应 用 的 类: l PipedInputStream l BufferedInputStream l PushBackInputStream l StreamTokenizer l PipedOutputStream l BufferedOutputStream l RandomAccessFile
我 们 不 在 此 讨 论 这 ?copy; 类, 但 你 可 以 在JAVA_HOME/src/java/io目 录 里 查 看 每 个 类 的 成 员 函 数 定 义。
9.4 文 件
在 我 们 进 行 文 件 操 作 时, 需 要 知 道 关 于 文 件 的 信 息。File类 提 ?copy; 了 一 ?copy; 成 员 函 数 来 操 纵 文 件 和 获 得 文 件 的 信 息。
9.4.1 创 建 一 个 新 的 文 件 对 象
你 可 用 下 面 三 个 方 法 来 创 建 一 个 新 文 件 对 象: File myFile; myFile = new
File(\"etc/motd\"); 或 myFile = new File(\"/etc\",\"motd\"); //more useful if the
directory or filename are variables 或 File myDir = new file(\"/etc\"); myFile =
new File(myDir,\"motd\");
这 三 种 方 法 取 决 于 你 访 问 文 件 的 方 式。 例 如, 如 果 你 在 应 用
程 序 里 只 用 一 个 文 件, 第 一 种 创 建 文 件 的 结 构 是 最 容 易 的。 但 如 果 你 在 同 一 目 录 里 打 开 数 个 文
件, 则 第 二 种 或 第 三 种 结 构 更 好。
9.4.2 文 件 测 试 和 使 用
一 但 你 创 建 了 一 个 文 件 对 象, 你 便 可 以 使 用 以 下 成 员 函 数 来 获 得 文 件 相 关 信 息: 文 件 名 l String getName() l String getPath() l String getAbslutePath() l String getParent() l boolean renameTo(File newName) 文 件 测 试 l boolean exists() l boolean canWrite() l boolean canRead() l boolean isFile() l boolean isDirectory() l boolean isAbsolute() 一 般 文 件 信 息 l long lastModified() l long length() 目 录 用 法 l boolean mkdir() l String[] list()
9.4.3 文 件 信 息 获 取 例 子 程 序
这 里 是 一 个 独 立 的 显 示 文 件 的 基 本 信 息 的 程 序, 文 件 通 过 命 令 行 参 数 传 输:
import
java.io.*; class fileInfo{ File fileToCheck; public static void main(String
args[]) throws IOException{ if (args.length>0){ for (int i=0;i